home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / xb.has < prev    next >
Text File  |  1997-03-05  |  51KB  |  3,096 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xb.has  ……   ぺけ-BASICのコンパイラ本体(メイン)
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.  
  9.     .include    doscall.mac
  10.     .include    iocscall.mac
  11.     .include    fefunc.h
  12.     .include    variable.h
  13.  
  14.  
  15.     .xref    statement_check
  16.     .xref    first_check_a5
  17.     .xref    first_check_a5_in_line
  18.     .xref    行末まで飛ばし
  19.     .xref    hash
  20.     .xref    hash_label特別
  21.     .xref    make_hash_istable
  22.     .xref    stat解釈
  23.     .xref    variable_check
  24.     .xref    math解釈
  25.     .xref    function解釈
  26.     .xref    function_check
  27.     .xref    global変数リスト作成
  28.     .xref    未宣言をint_sub
  29.     .xref    system変数table作成
  30.     .xref    dim_init_data
  31.     .xref    int定数get
  32.  
  33.     .xref    one_check
  34.     .xref    型get
  35.     .xref    型getS
  36.     .xref    名前登録
  37.     .xref    label_sub
  38.  
  39.     .xref    If_end
  40.     .xref    Else
  41.     .xref    else_check
  42.  
  43.     .xref    basic_exec
  44.  
  45.  
  46.     .text
  47.     .even
  48. start:
  49.     lea.l    $10(a0),a0
  50.     suba.l    a0,a1
  51.     movem.l    a0-a1,-(sp)
  52.     DOS    _SETBLOCK
  53.  
  54.     move.l    #_WORK,d2
  55.     move.l    #$c0_0000,-(sp)
  56.     DOS    _MALLOC
  57.     andi.l    #$ff_fff0,d0
  58.     cmp.l    d2,d0
  59.     bcs    mem_err0
  60.     move.l    d0,d1
  61.     move.l    d0,(sp)
  62.     DOS    _MALLOC        * メモリ最大確保
  63.     movea.l    d0,a6
  64.     lea.l    a6保存(pc),a1
  65.     move.l    d0,(a1)
  66.  
  67.     add.l    d2,d0
  68.     movea.l    d0,a4
  69.     lea.l    -$20(a4),sp    * 万が一の時のための余裕
  70.     move.l    d0,SPinit
  71.  
  72.     add.l    a6,d1
  73.     move.l    d1,mem_last
  74.  
  75.  
  76.  
  77.  
  78.  
  79.     moveq    #0,d7            * フラグリセット
  80.     moveq    #-1,d0
  81.  
  82.     move.l    d7,errorno
  83.     move.l    d7,行数
  84.     move.w    d7,EXITcode
  85.     move.w    d7,fkeyflag
  86.     move.b    d7,sinitFLAG
  87.     move.w    d0,関数file数
  88.     move.w    d0,breakcheck
  89.     move.w    d0,tagFP
  90.     movem.l    d0/d7,EXTENDmask    * OFFmask/ONmask
  91.  
  92.     move.w    d7,_FREEMEM(a6)
  93.     move.b    d7,cnf_filename
  94.     move.b    d7,tag_filename
  95.     move.b    d7,ed_filename
  96.  
  97. *    lea.l    $c4-$10(a0),a0        * 起動されたコマンド名
  98.     lea.l    $80-$10(a0),a0        * 起動されたドライブ+パス名
  99.     lea.l    起動dir,a1
  100. @@:
  101.     move.b    (a0)+,(a1)+
  102.     bne    @b
  103.     bsr    com_est
  104.  
  105.     bsr    make_hash_istable
  106.  
  107. **    **    **    **    **    **    初期化終了
  108.  
  109.  
  110.     pea.l    endendend(pc)
  111.     move.w    #$fff1,-(sp)    * どうやらINTERRUPT押したらここに飛んでくるらしいぞ
  112.     DOS    _INTVCS
  113.     addq.l    #6,sp
  114.  
  115.  
  116.     pea.l    _BREAK(pc)
  117.     move.w    #$2d,-(sp)    * CTRL+C によるブレークチェックフラグのセット
  118.     DOS    _INTVCS
  119.     lea.l    _breakflag(pc),a0
  120.     clr.w    (a0)+        * ブレークチェックフラグのリセット
  121.     move.l    d0,(a0)        * 元のベクタアドレス
  122.  
  123.     move.w    #-1,(sp)
  124.     DOS    _BREAKCK
  125.     move.w    d0,breakcheck
  126.     move.w    #2,(sp)        * BREAK KILL
  127.     DOS    _BREAKCK
  128.     addq.l    #6,sp
  129.  
  130.  
  131.     move.w    #$fe02,sinitASK        * always-never(deafault)
  132.     move.w    #-1,関数file数
  133.  * xb.cnf (basic.cnf) を読み込む。
  134.     bsr    cnf_read
  135.  
  136.     movem.l    EXTENDmask,d0/d1
  137.     and.l    d0,d7        * OFFmask
  138.     or.l    d1,d7        * ONmask
  139.  
  140.     clr.l    行数
  141.  
  142.  
  143.  
  144.  * 外部関数を読み込む
  145.     bsr    func_read
  146.  
  147.  
  148.     move.l    a4,strbuf
  149.     adda.l    #strbufSIZE,a4
  150.  
  151.     move.l    a4,nest_work
  152.     adda.l    #nest_workSIZE,a4
  153.  
  154.     move.l    a4,program_area
  155.  
  156.  
  157.  
  158.  * フリーエリア指定サイズ確保
  159.     moveq    #0,d0
  160.     move.w    _FREEMEM(a6),d0
  161.     bne    @f
  162.     move.w    #$100,d0    * default
  163. @@:
  164.     moveq    #10,d1
  165.     lsl.l    d1,d0        * 1K 倍
  166.  
  167.     lea.l    (a4,d0.l),a1
  168.     cmpa.l    mem_last,a1
  169.     bhi    mem_err1
  170.     move.l    a4,MEM1
  171.     move.l    a1,MEM2
  172.     move.l    a1,mem_last
  173.  
  174.     suba.l    a6,a1
  175.     move.l    a1,-(sp)
  176.     move.l    a6,-(sp)
  177.     DOS    _SETBLOCK
  178.     addq.l    #8,sp
  179.  
  180.  
  181.  
  182.  
  183.     bsr    system変数table作成
  184.  
  185.  
  186.  
  187.  
  188.  
  189. **    **    **    **    **    **
  190.     .xdef    restart
  191. restart:
  192.     move.l    MEM2,mem_last
  193.     clr.w    EXITcode
  194.     bclr    #warningF,d7
  195.     bclr    #modeF,d7
  196.  
  197.  
  198.  * BASICのファイルを読み込む
  199.     lea.l    basic_filename,a2
  200.  
  201.     clr.w    -(sp)
  202.     move.l    a2,-(sp)
  203.     DOS    _OPEN
  204.     tst.l    d0
  205.     bge    1f
  206.  
  207. @@:
  208.     tst.b    (a2)+
  209.     bne    @b
  210.     move.b    #'.',-1(a2)
  211.     move.b    #'b',(a2)+
  212.     move.b    #'a',(a2)+
  213.     move.b    #'s',(a2)+
  214.     clr.b    (a2)
  215.     DOS    _OPEN
  216.     tst.l    d0
  217.     bmi    help
  218. 1:
  219.  
  220.     move.l    program_area,a5
  221.     move.l    mem_last,d1
  222.     sub.l    a5,d1
  223.     bcs    mem_err
  224.     move.l    d1,-(sp)
  225. *    move.l    a5,-(sp)
  226.     pea.l    1(a5)        * 行番号対策など
  227.     move.w    d0,-(sp)
  228.     DOS    _READ
  229.     lea.l    1(a5,d0.l),a2        * last address
  230.     clr.b    (a2)
  231.     addq.l    #1+1+3,d0
  232.     andi.b    #$fc,d0
  233.     lea.l    (a5,d0.l),a4
  234.     cmp.l    d1,d0
  235.     bcc    mem_err
  236.     DOS    _CLOSE
  237.     lea.l    16(sp),sp
  238.  
  239.  
  240.  
  241. .ifdef    _DEBUG
  242.     IOCS    _ONTIME
  243.     move.l    d0,d2
  244. @@:
  245.     IOCS    _ONTIME
  246.     cmp.l    d0,d2
  247.     beq    @b
  248.     lea.l    _comptime(pc),a0
  249.     move.l    d0,(a0)
  250. .endif
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  * ベーシック内部で使用する変数の初期化
  261.  
  262.     moveq    #-1,d0        * 登録された個数 - 1
  263.     move.w    d0,4+変数int
  264.     move.w    d0,4+変数str
  265.     move.w    d0,4+変数char
  266.     move.w    d0,4+変数float
  267.     move.w    d0,4+配列
  268.  
  269.     move.w    d0,8+中間言語行数
  270.     move.w    d0,8+変数INIT
  271.     move.w    d0,8+引数INIT
  272.     move.w    d0,8+行番号
  273.     move.w    d0,8+ラベル
  274.     move.w    d0,8+goto飛先
  275.  
  276.     movea.l    nest_work,a0
  277.     clr.l    (a0)+
  278.  
  279.     clr.w    4+名前
  280.  
  281.     bsr    内部関数
  282.  
  283.  
  284.     move.l    a4,中間言語
  285.     move.l    a4,$c+中間言語行数
  286.  
  287. .ifdef    _DEBUG
  288.     moveq    #$e,d1
  289.     IOCS    _BITSNS
  290.     btst    #0,d0
  291.     beq    @f
  292.     bsr    func情報
  293. @@:
  294. .endif
  295.  
  296.  
  297.  
  298.  
  299.     move.l    program_area,a5
  300.     addq.l    #1,a5
  301.  
  302.     bset    #no_cnfF,d7
  303.  
  304.     bsr    first_check_a5_in_line
  305.     tst.w    d0
  306.     bne    @f
  307.     bset    #linenumF,d7        *行番号あり
  308. @@:
  309.  
  310.     move.b    #$a,-(a5)        * 行番号対策など
  311.     clr.l    行数
  312.  
  313.  
  314.  
  315.  * グローバル関数ブロックの冒頭処理
  316. *    movem.l    変数INIT,d0/d1
  317. *    sub.l    d1,d0
  318. *    move.w    d0,(a4)+    * 変数 area を初期化する時の参照するオフセット
  319. *    movem.l    引数INIT,d0/d1
  320. *    sub.l    d1,d0
  321. *    move.w    d0,(a4)+    * 引き数を取り込む時、参照するオフセット
  322.     clr.l    (a4)+        * 最初だから……
  323.  
  324.     btst    #b_argF,d7
  325.     beq    @f
  326.  
  327.     .xref    b_argc_def
  328.     bsr    b_argc_def
  329.  
  330.     pea.l    引数INIT
  331.     moveq    #1,d0        * 引き数の個数 - 1   ( b_argc;int , b_argv();str )
  332.     bsr    buf書込        * d1.w/a0-a1 破壊
  333.     move.w    #$8000,d0    * int
  334.     bsr    buf書込
  335.     moveq    #0,d0        * b_argc #
  336.     bsr    buf書込
  337.     moveq    #0,d0        * dim (1-dimensinal)  +  b_argv() #
  338.     bsr    buf書込L
  339.     addq.l    #4,sp
  340.     bra    1f
  341. @@:
  342.     pea.l    引数INIT    * 引き数何もなし
  343.     moveq    #-1,d0        * 引き数の個数 - 1
  344.     bsr    buf書込        * d1.w/a0-a1 破壊
  345.     addq.l    #4,sp
  346. 1:
  347.  
  348.  
  349.  * コンパイラ・メインルーチンの始まり始まり
  350. 解釈ループ0:
  351.     .xdef    break2
  352. break2:
  353.     lea.l    $100(a4),a0    * ちょっと余裕
  354.     cmpa.l    mem_last,a0
  355.     bcc    mem_err
  356.  
  357.  * a5 から調べ始める。
  358.  * まず、空白(9,10,13,32)を飛ばして、先頭の文字を見る。
  359.  * '/'か(注釈の可能性大)、その他か(プログラムの本文か)
  360.     bsr    first_check_a5
  361.  * 数字なら    d0 = 0
  362.  * プログラム終了なら        d0 = -1
  363.  * その他なら            d0 = そのキャラクタ
  364.     tst.w    d0
  365.     bmi    end
  366.     beq    bunpo_err
  367. .ifdef    _DEBUG
  368.     move.l    行数,d1
  369.     cmp.l    break行数(pc),d1
  370.     bne    @f
  371.     .xdef    breaknum
  372. breaknum:
  373.     nop            * 指定した行数でブレイクチェックするための
  374. @@:
  375. .endif
  376.  
  377.     cmpi.b    #'}',d0
  378.     beq    if_block
  379.     cmpi.b    #'?',d0        * print省略形
  380.     bhi    文解釈
  381.     beq    print省略形
  382.     cmpi.b    #'*',d0
  383.     beq    label_star
  384.     cmpi.b    #'/',d0        * remark
  385.     bne    文解釈
  386.     cmpi.b    #'*',1(a5)
  387.     bne    文解釈
  388.     bsr    行末まで飛ばし    * 注釈だ
  389.     bra    解釈ループ0
  390.  
  391. print省略形:
  392.     addq.l    #1,a5
  393.     moveq    #5,d0        * 'print'$$$
  394.     bra    stat22
  395.  
  396. label_star:
  397.     addq.l    #1,a5
  398.     bsr    hash
  399.     bsr    @f
  400.     bra    解釈ループ
  401. label_quote:
  402.     cmpi.b    #'"',(a5)+
  403.     bne    label_quote_err
  404.     bsr    hash_label特別
  405.     bsr    @f
  406.     cmpi.b    #'"',(a5)+
  407.     bne    label_quote_err
  408.     bra    解釈ループ
  409. @@:
  410.     bsr    label_sub    * d0 = label #
  411.     move.l    d0,d1
  412.     lsl.w    #3,d1
  413.     addq.w    #4,d1        * 行数の格納位置
  414.     movea.l    4+ラベル,a3
  415.     bsr    bufgetL
  416.     addq.l    #1,d0
  417.     bne    ラベル二重定義
  418.     move.l    a4,d2        * address
  419.     bsr    bufputL
  420.     rts
  421. ラベル二重定義:
  422.     ERRORS    81
  423. label_quote_err:
  424.     ERROR    82
  425.  
  426. if_block:
  427.     addq.l    #1,a5
  428. ifb2:
  429.     movea.l    nest_work,a0
  430.     tst.l    (a0)
  431.     beq    block_err
  432.     cmpi.w    #3,8(a0)
  433.     bne    block_err
  434.  
  435.     move.w    10(a0),d0        * if_flag (0/1/2/3)
  436.     btst    #0,d0            * block?
  437.     bne    ifb1
  438.  
  439.     bsr    If_end        * if 文で、改行終わりの時
  440.     bra    ifb2        * もう一個上にある「はず」
  441.  
  442. ifb1:
  443.     btst    #1,d0            * then/else
  444.     bne    ifb3
  445.  
  446.     bsr    else_check
  447.     bne    ifb3
  448.     addq.l    #4,a5
  449.  
  450.     movea.l    nest_work,a0
  451.     clr.w    10(a0)        * if_flag ( 0 = '{'のない/'}'で閉じた後の then ) (H8/2/1)
  452.     bsr    Else
  453.     addq.l    #1,a5        * ':' ごたごたしてるけど、とりあえず
  454.     bra    解釈ループ0        * すぐ文
  455.  
  456.  
  457. ifb3:
  458.     bsr    If_end        * if 文で、ブロック終わりの時
  459.     bra    解釈ループ
  460.  
  461. block_err:
  462.     ERROR    31
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469. 文解釈:
  470.  * 最初の対象を見つけたので
  471.  * これからハッシュ値を計算しながら、文字数を数えさせる
  472.     bsr    hash
  473.  * a2.l = 元の対象の開始アドレス
  474.  * d5.w = ハッシュ値だ。上位バイトもそのままだ
  475.  * d4.l = (hash.w)(文字数-1)
  476.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  477.     tst.w    d4
  478.     bmi    bunpo_err
  479.  
  480.  
  481.  
  482.  * 対象がどれかステートメントと一致するかどうか
  483.  * a2.l = 元の対象の開始アドレス
  484.  * d5.w = ハッシュ値
  485.  * d4.w = 文字数 - 1
  486.     bsr    statement_check
  487.  * 一致すれば        d0 = そのステートメント番号
  488.  * 一致しなければ    d0 = 0
  489.  
  490. stat22:
  491.     tst.w    d0
  492.     beq    ステートメントでない
  493.     cmpi.w    #$2a,d0        * 'label'
  494.     beq    label_quote
  495.  
  496.  * 各ステートメントごとに文法が違うのでいちいち異なる解釈をしなければ
  497.  * d1.b = お次の文字 (  (,[,=,:, , etc... )
  498.     bsr    stat解釈
  499.     bra    解釈ループ
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514.  
  515.  
  516. ステートメントでない:
  517.  
  518.  
  519.  * 関数かどうかチェックする
  520.     cmpi.b    #'(',d1
  521.     bne    変数かどうかチェック
  522.  
  523.  
  524.  *         d4.l = * (hash.w)(文字数-1)
  525.  *         a2.l = 元の対象の開始アドレス
  526.     bsr    function_check
  527.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  528.  *    = $8000  float
  529.  *    = $8001  int
  530.  *    = $8003  str
  531.  *    = $ffff  void
  532.  * d0.w < 0 の時
  533.  *    d1.w = 引き数の個数
  534.  *    d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  535.  *    a2   = パラメーターテーブル
  536.     tst.w    d0
  537.     beq    変数かどうかチェック
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  * 関数の処理
  545.     clr.w    (a4)+        * 中間言語書き込み
  546.     movea.l    a4,a3
  547.  * 関数の解釈
  548.  * input    a2   = パラメーターテーブル
  549.  *        a3   = 書き込み先アドレス
  550.  *        d1.w = 引き数の個数
  551.  *        d3.w = 0 から始まる関数番号    ( < 0 : 内部関数になる予定 )
  552.     bsr    function解釈
  553.  *        d0   = 書き込んだ長さ
  554.     add.l    d0,a4
  555.  
  556.     bra    解釈ループ
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565. 変数かどうかチェック:
  566.  
  567.  *         d4.l = * (hash.w)(文字数-1)
  568.  *         a2.l = 元の対象の開始アドレス
  569.      bsr    variable_check
  570.  * 重なってない        d2.l    = -1
  571.  * int の n 番と一致    d2.l    = n+0000    ( n < システム変数 )
  572.  * str の n 番と一致    d2.l    = n+0100    ( n < システム変数 )
  573.  * char の n 番と一致    d2.l    = n+0200
  574.  * float の n 番と一致    d2.l    = n+8000
  575.  * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
  576.  * d0 =   0 : 普通の変数
  577.  *      1 : 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  578.  *    $80 : auto 変数
  579.  *    $81 : auto 配列    ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
  580.  *     -1 : 当たりなし
  581.     bmi    misengen
  582.     tst.l    d2
  583.     bmi    sysに代入
  584.  
  585.     bclr    #7,d0
  586.     beq    @f
  587.     swap    d2
  588.     not.w    d2        * AUTO 変数
  589.     swap    d2
  590. @@:
  591.  
  592.     tst.w    d0
  593.     beq    配列以外に代入
  594. *    beq    普通の変数に代入
  595.  * 配列に代入
  596.  
  597.     cmpi.b    #'(',(a5)
  598.     bne    dim_init
  599.  
  600.     move.l    d2,-(sp)    * 式の型・保存
  601.     moveq    #0,d0        * 添え字書き込みサイズ
  602.     move.w    $a(a0),d1    * 次元 - 1
  603.     lea.l    tmp,a3
  604. @@:
  605.     addq.l    #1,a5
  606.     movem.l    d0/d1,-(sp)
  607.     moveq    #0,d2        * 添え字は整数だ
  608.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  609.  * int        d2.w    = 0000
  610.     bsr    math解釈
  611.     add.l    (sp)+,d0
  612.     move.l    (sp)+,d1
  613.  
  614.     cmpi.b    #',',(a5)
  615.     dbne    d1,@b
  616.     beq    添え字の個数が多い
  617.     tst.w    d1
  618.     bne    添え字の個数が少ない
  619.     cmpi.b    #')',(a5)+
  620.     bne    bunpo_err
  621.  
  622.     move.l    (sp)+,d2
  623.     bra    普通の変数に代入
  624.  
  625.  
  626.  
  627.  
  628.  
  629. sysに代入:
  630.     swap    d2
  631.     addq.w    #1,d2
  632.     beq    set_date
  633.     addq.w    #2,d2
  634.     beq    set_time
  635.     ERRORS    58        * date$, time$ 以外に代入
  636.  
  637. set_date:
  638.     clr.w    -(sp)
  639.     bra    @f
  640. set_time:
  641.     move.w    #1,-(sp)
  642. @@:
  643.     move.w    #41*2,(a4)+        * statement $$$ 'SysVar' 
  644.     swap    d2        * d2.w = $0100
  645.  
  646.     bsr    first_check_a5_in_line        *
  647.     cmpi.b    #'=',(a5)+
  648.     bne    bunpo_err
  649.  
  650.     movea.l    a4,a3
  651.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  652.  * str        d2.w    = 0100
  653.     bsr    math解釈
  654.     movea.l    a3,a4
  655.     move.w    (sp)+,(a4)+
  656.     bra    解釈ループ
  657.  
  658.  
  659. 配列以外に代入:
  660.     cmpi.b    #'[',(a5)
  661.     beq    文字列の途中への代入
  662.  
  663. 普通の変数に代入:
  664.     move.l    d0,-(sp)    * 普通の変数になら 0.w
  665.                 * 配列,a[i] になら今 tmp 上にある添え字式の長さ ( >0 )
  666.  
  667.     bsr    first_check_a5_in_line        *
  668.     cmpi.b    #'=',(a5)+
  669.     bne    bunpo_err
  670.  
  671. *    movea.l    a4,a3
  672.     lea.l    2(a4),a3
  673.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  674.  * int        d2.w    = 0000
  675.  * str        d2.w    = 0100
  676.  * char     d2.w    = 0200
  677.  * float    d2.w    = 8000
  678.  * 型未判明    d2.w    = ffff
  679.     bsr    math解釈
  680.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  681.  
  682.     lsr.w    #8,d6
  683.     bset    #15,d6        * 代入式の印、下位バイトは変数の型
  684.     move.l    (sp)+,d1
  685.     tst.w    d1        * あやしいから
  686.     beq    普通変数代入用中間言語
  687.  
  688.  
  689.  * 配列代入用中間言語
  690.     bset    #14,d6        * 配列の印
  691.     move.w    d6,(a4)+        * 中間言語書き込み
  692.     add.l    d0,a4
  693.     swap    d6        * 配列番号
  694.     move.w    d6,(a4)+        * 中間言語書き込み
  695.  
  696.     lsr.w    #1,d1
  697.     subq.w    #1,d1
  698.     bcs    sonnahazuhanai
  699.     lea.l    tmp,a0        * 添え字の式
  700. @@:
  701.     move.w    (a0)+,(a4)+
  702.     dbra    d1,@b
  703.     bra    解釈ループ
  704.  
  705.  
  706. 普通変数代入用中間言語:
  707.     move.w    d6,(a4)+        * 中間言語書き込み
  708.     add.l    d0,a4
  709.     swap    d6        * 変数番号
  710.     move.w    d6,(a4)+        * 中間言語書き込み
  711.     bra    解釈ループ
  712.  
  713.  
  714.  
  715.  
  716. 文字列の途中への代入:
  717.  * 文字列の途中 a[i]への代入
  718.  
  719.     move.w    #38*2,(a4)+        * statement $$$ 'STR' 
  720.     move.l    d2,-(sp)
  721.  
  722.     addq.l    #1,a5
  723.     moveq    #0,d2        * 添え字は整数だ
  724.  
  725.     movea.l    a4,a3
  726.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  727.  * int        d2.w    = 0000
  728.     bsr    math解釈
  729.  
  730.     cmpi.b    #']',(a5)+
  731.     bne    bunpo_err
  732.     bsr    first_check_a5_in_line
  733.     cmpi.b    #'=',(a5)+
  734.     bne    bunpo_err
  735.  
  736.     move.w    #$0200,d2    * char 型。
  737.  * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
  738.  * char     d2.w    = 0200
  739.  * 型未判明    d2.w    = ffff
  740.     bsr    math解釈
  741.  *    return  d6.w    = 変数の型(d2=ffff 以外なら d2.l を保存)
  742.     movea.l    a3,a4
  743.     move.l    (sp)+,d2    * 上位ワードは文字列変数番号
  744.  
  745.     swap    d2        * 変数番号
  746.     move.w    d2,(a4)+        * 中間言語書き込み
  747.     bra    解釈ループ
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757. dim_init:
  758.     bsr    first_check_a5_in_line
  759.     cmpi.b    #'=',d0
  760.     bne    bunpo_err
  761.  
  762.     lea.l    $a(a0),a0
  763.     move.w    (a0)+,d3
  764.     moveq    #1,d0
  765.     moveq    #0,d1
  766. @@:
  767.     move.w    (a0)+,d1
  768.     addq.l    #1,d1
  769.     FPACK    __UMUL
  770.     dbra    d3,@b
  771.     move.l    d0,d1
  772.  
  773.  * 初期化データ
  774.  *    d3 = 型
  775.  *    d2 = 配列番号
  776.  *    d1 = 添え字大きさ
  777.     move.w    d2,d3
  778.     lsr.w    #8,d3
  779.     swap    d2
  780.     bsr    dim_init_data
  781.     *bra    解釈ループ
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788. 解釈ループ:
  789.     bsr    first_check_a5_in_line
  790.     bmi    解釈ループ0    * 改行文字だ
  791.     cmpi.b    #':',d0
  792.     beq    コロン
  793.     cmpi.b    #'}',d0        * 'if' block end
  794.     beq    解釈ループ0
  795.  
  796.     cmpi.b    #'/',d0        * 注釈
  797.     bne    @f
  798.     cmpi.b    #'*',1(a5)
  799.     beq    解釈ループ0
  800. @@:
  801.  
  802.     bsr    else_check    * else の可能性あり
  803.     bne    bunpo_err
  804.     bra    解釈ループ0
  805.  
  806. コロン:
  807.     addq.l    #1,a5
  808.     bra    解釈ループ0
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  * 未宣言変数への代入があれば、警告を出して整数型に勝手に宣言する
  818. 未宣言をint:
  819.     bsr    未宣言をint_sub
  820.     moveq    #0,d0        * 普通の変数に代入につなぐため必要
  821.     bra    普通の変数に代入
  822.  
  823.  
  824.     .xdef    misengen
  825. misengen:
  826.     cmpi.b    #'=',(a5)
  827.     beq    未宣言をint
  828.     cmpi.b    #'(',(a5)
  829.     bne    misengen_var
  830.     ERRORS    34
  831. bunpo_err:
  832.     ERROR    4
  833. misengen_var:
  834.     ERRORS    7
  835. sonnahazuhanai:
  836.     ERROR    2
  837. 添え字の個数が少ない:
  838.     ERROR    56
  839. 添え字の個数が多い:
  840.     ERROR    57
  841.  
  842.  
  843.  
  844.  
  845.     * メイン・関数ブロック終了時の処理
  846. end:
  847.     tst.b    d7        * global/auto
  848.     bmi    内部関数あり
  849.  
  850.  * global
  851.     movea.l    nest_work,a0
  852.     tst.l    (a0)
  853.     bne    nest_structure終わってない
  854.  
  855.     move.w    #$0013*2,(a4)+    * 'end'$$$
  856.     bsr    global変数リスト作成
  857.     bra    @f
  858.  
  859. 内部関数あり:
  860.     bclr    #endfuncF,d7
  861.     beq    no_endfunc
  862. @@:
  863.  
  864.  
  865.     move.l    a4,変数area
  866.     .xref    Goto整理
  867.     bsr    Goto整理
  868.  
  869.  * 中間言語にコンパイルするのが終わった
  870.  
  871.  
  872.  
  873.  
  874.  * 変数・引数INIT が連結でなかったら、つなぐ
  875.     lea.l    変数INIT,a1
  876.     bsr    chain連結
  877.     lea.l    引数INIT,a1
  878.     bsr    chain連結
  879.  
  880.  
  881. .ifdef    _DEBUG
  882.     bsr    DEBUG情報
  883. .endif
  884.  
  885.  
  886.     btst    #warningF,d7
  887.     beq    @f
  888.     pea.l    _warning発生(pc)
  889.     bsr    YorN
  890.     addq.l    #4,sp
  891.     beq    @f
  892.     move.w    #1,EXITcode
  893.     bra    endendend
  894. @@:
  895.  
  896.     moveq    #Finit,d1
  897.     bsr    Fルーチン
  898.     moveq    #Frun,d1
  899.     bsr    Fルーチン
  900.     bset    #0,global_flag        * Finit通った
  901.  
  902.  
  903.  
  904.     clr.l    行数
  905.  
  906.  
  907.     bclr    #modeF,d7        * global mode
  908. .ifndef    _DEBUG
  909.     bset    #cursorF,d7        * cursor ON
  910.     move.w    #18,-(sp)        * cursor OFF
  911.     DOS    _CONCTRL
  912.     addq.l    #2,sp
  913. .endif
  914.  
  915.     clr.w    scroll開始行
  916.     bsr    FKEYset
  917.  
  918. ; 実行時間の表示(開始時間) by Eriko 95/02/19
  919.     .ifdef    _RUNTIME
  920.  
  921.     IOCS    _ONTIME
  922.     move.l    d0,d2
  923. @@
  924.     IOCS    _ONTIME
  925.     cmp.l    d0,d2
  926.     beq    @b
  927.     lea.l    _runtime(pc),a0
  928.     move.l    d0,(a0)
  929.  
  930.     .endif            ここまで
  931.  
  932.  
  933.  
  934.     btst    #b_argF,d7
  935.     beq    @f
  936.         move.l    b_argv,-(sp)
  937.         subq.l    #4,sp
  938.         move.w    #$0003,-(sp)    * str (関係ないけど一応)
  939.         move.l    b_argc,-(sp)
  940.         subq.l    #4,sp
  941.         move.w    #$0001,-(sp)    * int (関係ないけど一応)
  942.         move.w    #2,-(sp)    * 2個
  943. @@:
  944.     move.l    中間言語,a5
  945.     bsr    basic_exec
  946.  
  947.  
  948.  
  949.     .xdef    endendend
  950. endendend:
  951.  
  952. ; 実行時間の表示 by Eriko 95/01/27
  953.     .ifdef    _RUNTIME
  954.     IOCS    _ONTIME
  955.     sub.l    _runtime(pc),d0
  956.     lea.l    tmp,a0
  957.     move.l    a0,-(sp)
  958.     moveq    #6,d1
  959.     FPACK    __IUSING
  960.     move.l    #'/100',(a0)+
  961.     move.w    #$0d0a,(a0)+
  962.     clr.b    (a0)
  963.     DOS    _PRINT
  964.     addq.l    #4,sp
  965.     .endif            ここまで
  966.  
  967.     moveq    #0,d3        * EXITcode 予約
  968.     movea.l    a6保存(pc),a6
  969.     move.l    a6,d0
  970.     bmi    exit
  971.     movea.l    SPinit,sp
  972.  
  973.  
  974.     tst.w    tagFP
  975.     bmi    @f
  976.     move.w    tagFP,-(sp)
  977.     DOS    _CLOSE
  978.     addq.l    #2,sp
  979.     move.w    #-1,tagFP
  980. @@:
  981.  
  982.     bsr    FKEY戻す
  983.  
  984.     move.w    #17,-(sp)    * cursor on
  985.     DOS    _CONCTRL
  986.     addq.l    #2,sp
  987.  
  988.     tst.w    EXITcode
  989.     beq    @f
  990.     tst.b    ed_filename
  991.     beq    @f
  992.     bsr    ed起動
  993.     bne    restart
  994. @@:
  995.  
  996.     move.l    _breakflag+2(pc),-(sp)
  997.     beq    @f
  998.     move.w    #$2d,-(sp)    * CTRL+C によるブレークチェックフラグのセット
  999.     DOS    _INTVCS
  1000. @@:
  1001.     move.l    #$0006_00ff,(sp)
  1002.     DOS    _KFLUSH
  1003.     move.w    breakcheck,(sp)
  1004.     bmi    @f
  1005.     DOS    _BREAKCK
  1006. @@:
  1007.  
  1008.     btst    #0,global_flag
  1009.     beq    @f
  1010.     moveq    #Fend,d1
  1011.     bsr    Fルーチン
  1012.     moveq    #Fexit,d1
  1013.     bsr    Fルーチン
  1014. @@:
  1015.     moveq    #0,d0
  1016.     bsr    初期化sub
  1017.  
  1018.     move.w    EXITcode,d3
  1019.     move.l    a6,-(sp)
  1020.     DOS    _MFREE
  1021.     addq.l    #4,sp
  1022.  
  1023. exit:
  1024.     bsr    最左カラム
  1025.     move.w    d3,-(sp)
  1026.     DOS    _EXIT2
  1027.  
  1028.  
  1029. help:
  1030.     pea.l    _TITLE(pc)
  1031.     DOS    _PRINT
  1032.     pea.l    _HELP(pc)
  1033.     DOS    _PRINT
  1034.     move.w    #1,(sp)
  1035.     DOS    _EXIT2
  1036.  
  1037.  
  1038.  
  1039. 初期化sub:
  1040.     lea.l    sinitASK,a0
  1041.     move.b    sinitFLAG,d3
  1042.     bne    @f
  1043.     addq.l    #1,a0
  1044. @@:
  1045.     tst.b    (a0)
  1046.     bgt    初期化しない
  1047.     bmi    @f
  1048.     tst.w    d0
  1049.     bne    @f
  1050.  
  1051.     pea.l    _初期化するか(pc)
  1052.     bsr    YorN
  1053.     addq.l    #4,sp
  1054.     bne    初期化しない
  1055. @@:
  1056.     add.b    d3,d3            bit 7:screen/console/width 64
  1057.     bcc    @f
  1058.  
  1059.     move.l    #$0010_0000,-(sp)
  1060.     DOS    _CONCTRL
  1061. *    move.w    #$000e,(sp)
  1062.     subq.w    #2,(sp)
  1063.     DOS    _CONCTRL
  1064.     pea.l    _TITLE(pc)
  1065.     DOS    _PRINT
  1066.     addq.l    #8,sp
  1067. @@:
  1068.  
  1069.     add.b    d3,d3            bit 6:color []
  1070.     bcc    @f
  1071.     bsr    init_tpal
  1072. @@:
  1073. 初期化しない:
  1074.     rts
  1075.  
  1076. mem_err0:
  1077.     pea.l    1+errmes(pc)
  1078.     DOS    _PRINT
  1079.     move.w    #1,(sp)
  1080.     DOS    _EXIT2
  1081. mem_err1:
  1082.     move.w    #-1,関数file数
  1083.     ERROR    0
  1084. mem_err:
  1085.     ERROR    1
  1086. nest_structure終わってない:
  1087.     ERROR    42
  1088. no_endfunc:
  1089.     ERROR    43
  1090.  
  1091.  
  1092.  
  1093.  
  1094. .ifdef    _DEBUG
  1095. filename:
  1096.     .dc.b    'test.obj',0
  1097. filename2:
  1098.     .dc.b    'test.var',0
  1099. .endif
  1100.  
  1101. xbcnf_file:
  1102.     .dc.b    'xb.cnf',0
  1103. cnf_file:
  1104.     .dc.b    'basic.cnf',0
  1105. _TITLE:
  1106.     .dc.b    $1b,'[1m ぺけBASIC',$1b,'[m ver.0.02 ( H9/3/5 版 )   (c)v914AKSTN.',13,10,0
  1107. _HELP:
  1108. *    .dc.b    'とりあえずベーシックのファイル名を指定して実験',13,10
  1109.     .dc.b    '使用方 : xb.r [-option] BASICファイル名(.bas)',13,10
  1110.     .dc.b    9,'-f<数字> : フリーエリアの大きさの指定 ( Kb 単位 )',13,10
  1111.     .dc.b    9,'-c<名前> : コンフィグファイル名の指定',13,10
  1112.     .dc.b    9,'-e<文字> : 拡張機能の ON/OFF',13,10
  1113. .ifdef    _DEBUG
  1114.     .dc.b    9,'-d<行数> : 指定行にて breaknum のブレイクチェック',13,10
  1115.     .dc.b    ' * DEBUG MODE *',13,10,0
  1116. M01:    .dc.b    '確保メモリ:',0
  1117. M02:    .dc.b    '残りメモリ:',0
  1118. Mkb:    .dc.b    ' Kb',13,10,0
  1119. .endif
  1120.     .dc.b    0
  1121.     .even
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127. _BREAK:                * CTRL+C によるブレークチェックフラグのセット
  1128.     move.l    a0,-(sp)
  1129.  
  1130.  * キーバッファに無理矢理改行を書き込む(いいのか?)
  1131.     cmpi.w    #$40,$812.w
  1132.     beq    1f
  1133.     movea.l    $814.w,a0
  1134.     addq.l    #2,a0
  1135.     cmpa.w    #$89c,a0
  1136.     bcs    @f
  1137.     lea.l    $81c.w,a0
  1138. @@:
  1139.     move.w    #$1d0d,(a0)
  1140.     move.l    a0,$814.w
  1141.     addq.w    #1,$812.w
  1142. 1:
  1143.  
  1144.  
  1145.     lea.l    _breakflag(pc),a0
  1146.     move.w    #-1,(a0)        * ブレークチェックフラグのセット
  1147.     move.l    (sp),a0
  1148.     move.l    _breakflag+2(pc),(sp)        * 元のベクタアドレス
  1149.     rts
  1150.  
  1151.     .xdef    _breakflag
  1152. _breakflag:
  1153.     .dc.w    0
  1154.     .dc.l    0
  1155.  
  1156. a6保存:
  1157.     .dc.l    0
  1158.  
  1159.  
  1160.  
  1161.     .ifdef    _RUNTIME
  1162. _runtime:
  1163.     .dc.l    0
  1164.     .endif
  1165.     .ifdef    _DEBUG
  1166. _comptime:
  1167.     .dc.l    0
  1168.     .endif
  1169.  
  1170.  
  1171.  
  1172. **    **    **    **    **    **    **    **    **    **
  1173.  
  1174.     .xdef    errors
  1175.     .xdef    error
  1176.     .xdef    warnings
  1177.     .xdef    warning
  1178. errors:
  1179.     bsr    最左カラム
  1180.     bsr    err画面
  1181.     bsr    errors_sub
  1182.     bra    @f
  1183. error:
  1184.     bsr    最左カラム
  1185.     bsr    err画面
  1186.     bsr    error_sub
  1187. @@:
  1188.     move.w    #1,EXITcode
  1189.     bra    endendend
  1190. warnings:
  1191.     btst    #warnoffF,d7
  1192.     bne    warnend
  1193.     movem.l    d0-d2/d4/a0-a4,-(sp)
  1194.     pea.l    _warning(pc)
  1195.     DOS    _PRINT
  1196.     addq.l    #4,sp
  1197.     move.l    (sp),d0        * error #
  1198.     bsr    errors_sub
  1199.     bra    @f
  1200. warning:
  1201.     btst    #warnoffF,d7
  1202.     bne    warnend
  1203.     movem.l    d0-d2/d4/a0-a4,-(sp)
  1204.     pea.l    _warning(pc)
  1205.     DOS    _PRINT
  1206.     addq.l    #4,sp
  1207.     move.l    (sp),d0        * error #
  1208.     bsr    error_sub
  1209. @@:
  1210.     movem.l    (sp)+,d0-d2/d4/a0-a4
  1211.     bset    #warningF,d7
  1212. warnend:
  1213.     rts
  1214.  
  1215.  
  1216.  
  1217.  
  1218. err画面:
  1219.     move.l    d0,-(sp)
  1220.     moveq    #1,d0
  1221.     bsr    初期化sub
  1222.     move.w    #$0101,sinitASK
  1223.     move.l    (sp)+,d0
  1224.     rts
  1225.  
  1226.  
  1227. errors_sub:
  1228.     move.w    d0,-(sp)
  1229.     lea.l    tmp,a0
  1230.     move.l    a0,-(sp)
  1231.     move.b    #$27,(a0)+
  1232. @@:
  1233.     move.b    (a2)+,(a0)+
  1234.     dbra    d4,@b
  1235.     move.b    #$27,(a0)+
  1236.     move.b    #' ',(a0)+
  1237.     clr.b    (a0)
  1238.     DOS    _PRINT
  1239.     addq.l    #4,sp
  1240.     move.w    (sp)+,d0
  1241.     bra    1f
  1242. error_sub:
  1243.     clr.b    tmp
  1244. 1:
  1245.     lea.l    errmes(pc),a1
  1246. @@:
  1247.     tst.b    (a1)+
  1248.     bne    @b
  1249.     dbra    d0,@b
  1250.     move.l    a1,-(sp)    * error message
  1251.     DOS    _PRINT
  1252.     addq.l    #4,sp
  1253.  
  1254.     lea.l    $100+tmp,a0    * tag file に書き出す文字列
  1255.     move.b    #$09,(a0)+
  1256.  
  1257.  
  1258.     move.l    行数,d1
  1259.     beq    3f
  1260.  
  1261.     pea.l    tenten(pc)
  1262.     DOS    _PRINT
  1263.     move.l    d1,(sp)        * 行数表示
  1264.     bsr    dec_print
  1265.     pea.l    gyou(pc)
  1266.     DOS    _PRINT
  1267.     addq.l    #8,sp
  1268.  
  1269.     move.l    d1,d0        * tag file
  1270.     moveq    #6,d1
  1271.     FPACK    __IUSING
  1272.     move.b    #' ',(a0)+
  1273.     move.b    #':',(a0)+
  1274.     move.b    #' ',(a0)+
  1275.     lea.l    tmp,a2        * 変数名などの情報
  1276. @@:
  1277.     move.b    (a2)+,(a0)+
  1278.     bne    @b
  1279.     subq.l    #1,a0
  1280.     bra    4f
  1281.  
  1282. 3:
  1283.     clr.b    ed_filename    * 行数の情報がないエラーならエディタは起動しない
  1284. 4:
  1285.     pea.l    crlf(pc)
  1286.     DOS    _PRINT
  1287.     addq.l    #4,sp
  1288.  
  1289. @@:
  1290.     move.b    (a1)+,(a0)+    * error message を tag file に
  1291.     bne    @b
  1292.     move.b    #$0d,-1(a0)
  1293.     move.b    #$0a,(a0)+
  1294.     clr.b    (a0)
  1295.  
  1296.  
  1297.     tst.b    tag_filename    * tag file 書きだし
  1298.     beq    1f
  1299.     move.w    tagFP,d0
  1300.     bge    @f
  1301.     move.w    #$20,-(sp)
  1302.     pea.l    tag_filename
  1303.     DOS    _CREATE
  1304.     addq.l    #6,sp
  1305.     move.w    d0,tagFP
  1306. @@:
  1307.     move.w    d0,-(sp)
  1308.     pea.l    basic_filename
  1309.     DOS    _FPUTS
  1310.     addq.l    #4,sp
  1311.     pea.l    $100+tmp
  1312.     DOS    _FPUTS
  1313.     addq.l    #6,sp
  1314. 1:
  1315.  
  1316.     rts
  1317.  
  1318.  
  1319.  
  1320.     .xdef    YorN
  1321. YorN:
  1322.     move.l    4(sp),-(sp)
  1323.     DOS    _PRINT
  1324.     pea.l    _YorN(pc)
  1325.     DOS    _PRINT
  1326.     addq.l    #8,sp
  1327.     DOS    _GETCHAR
  1328.     move.w    d0,-(sp)
  1329.     pea.l    crlf(pc)
  1330.     DOS    _PRINT
  1331.     addq.l    #4,sp
  1332.     moveq    #$20,d0
  1333.     or.w    (sp)+,d0
  1334.     cmpi.b    #'y',d0
  1335.     rts
  1336.  
  1337. _YorN:
  1338.     .dc.b    ' ( Y or N )',0
  1339.  
  1340. _warning発生:
  1341.     .dc.b    'ワーニングがありますが、プログラムを実行しますか?',0
  1342. _初期化するか:
  1343.     .dc.b    '画面を初期化しますか?',0
  1344.  
  1345. _warning:
  1346.     .dc.b    'Warning : ',0
  1347. tenten:
  1348.     .dc.b    ' ……',0
  1349. gyou:
  1350.     .dc.b    '行目',0
  1351. crlf:
  1352.     .dc.b    13,10,0
  1353.  
  1354.  
  1355. errmes:    .dc.b    0
  1356. e00:    .dc.b    'メモリを確保出来ませんでした',13,10,0
  1357. e01:    .dc.b    'フリーエリアが足りませんです',0
  1358. e02:    .dc.b    'ぺけBにバグ有り',0
  1359. e03:    .dc.b    'そのステートメントは未サポートだ',0
  1360. e04:    .dc.b    '文法エラー',0
  1361. e05:    .dc.b    '変数の宣言が変である',0
  1362. e06:    .dc.b    '二重に宣言するなんて',0
  1363. e07:    .dc.b    'そいつは未宣言の変数だろう',0
  1364. e08:    .dc.b    'スタックがあふれました',0
  1365. e09:    .dc.b    '変な式だな',0
  1366. e10:    .dc.b    'そのステートメントはまだ実行出来ない',0
  1367. e11:    .dc.b    'dim 無しで配列宣言しましたね',0
  1368. e12:    .dc.b    '行番号がここだけないです',0
  1369. e13:    .dc.b    '先頭が数字だとややこしいですよ',0
  1370. e14:    .dc.b    'コンフィグの書き方が変である',0
  1371. e15:    .dc.b    '指定された外部関数のファイルが無い',0
  1372. e16:    .dc.b    '関数の引き数が多いみたいだが',0
  1373. e17:    .dc.b    0    *'配列はもうちょっと待つんだ',0
  1374. e18:    .dc.b    '関数の中に変な引き数があるな',0
  1375. e19:    .dc.b    '外部関数ファイルのパラメータテーブルがおかしい',0
  1376. e20:    .dc.b    '外部関数内でエラーだわ',0
  1377. e21:    .dc.b    'void 型の関数には返り値はないんだよ',0
  1378. e22:    .dc.b    'ステートメントのパラメータの個数が少ない',0
  1379. e23:    .dc.b    'color[ に対応する ] がありません',0
  1380. e24:    .dc.b    'width に指定出来る値は 64 と 96 だけです',0
  1381. e25:    .dc.b    'for 文の書き方がおかしい',0
  1382. e26:    .dc.b    '使用する変数の型が違う',0
  1383. e27:    .dc.b    'next に対応する for がない',0
  1384. e28:    .dc.b    'ネスト構造無しに break, continue はできません',0
  1385. e29:    .dc.b    'if のない then, else です',0
  1386. e30:    .dc.b    'if 文の書き方がおかしい',0
  1387. e31:    .dc.b    '式の型が違う',0
  1388. e32:    .dc.b    'endwhile に対応する while がない',0
  1389. e33:    .dc.b    'until に対応する repeat がない',0
  1390. e34:    .dc.b    '未宣言の関数か配列でないかい',0
  1391. e35:    .dc.b    '配列の宣言に添え字の指定がありませんよ',0
  1392. e36:    .dc.b    '配列の宣言がおかしいですよ',0
  1393. e37:    .dc.b    '配列の添え字が大きすぎます',0
  1394. e38:    .dc.b    '配列の添え字が負の数のようですね',0
  1395. e39:    .dc.b    'func 文の書式に間違いがあるです',0
  1396. e40:    .dc.b    'その関数名はすでに使われております',0
  1397. e41:    .dc.b    '文字列へアクセスするポインタの値がまずいです',0
  1398. e42:    .dc.b    'ネスト構造が閉じていませんね',0
  1399. e43:    .dc.b    'endfunc がありませんです',0
  1400. e44:    .dc.b    'locate のパラメータが無効ですねん',0
  1401. e45:    .dc.b    'endfunc or return に対応する func がありませんです',0
  1402. e46:    .dc.b    'switch の中で continue ですか?',0
  1403. e47:    .dc.b    'case, default, endswitch には switch が必要なんです',0
  1404. e48:    .dc.b    'switch にはやっぱり 1 個は case がないと',0
  1405. e49:    .dc.b    'func ~ endfunc の中に返り値がありません',0
  1406. e50:    .dc.b    'return 文の書き方変',0
  1407. e51:    .dc.b    'using 文のフォーマットがおかしい',0
  1408. e52:    .dc.b    'using 文の後の ',$27,';',$27,' がないです',0
  1409. e53:    .dc.b    'console文のパラメータがまずい',0
  1410. e54:    .dc.b    'break しました',0
  1411. e55:    .dc.b    'input, linput 文の書き方違う',0
  1412. e56:    .dc.b    '配列の添え字の個数が少ないんです',0
  1413. e57:    .dc.b    '配列の添え字の個数が多いんです',0
  1414. e58:    .dc.b    'システム変数にゃ代入出来ません',0
  1415. e59:    .dc.b    '未宣言変数を int 型に割り振ります',0
  1416. e60:    .dc.b    '配列は10次元までしか扱えないんですゴメンナサイ',0
  1417. e61:    .dc.b    'default の後に case, default は置かない方がいいですよね',0
  1418. e62:    .dc.b    'exit 文の書き方変である',0
  1419. e63:    .dc.b    'key に , がありませんね',0
  1420. e64:    .dc.b    'key のパラメーターがまずいです',0
  1421. e65:    .dc.b    '指定されたコンフィグファイルがありません',0
  1422. e66:    .dc.b    '行番号の後には空白をお願いします',0
  1423. e67:    .dc.b    'input系, key があるので、ファンクションキーを本家互換に書き替えた方がいいです',0
  1424. e68:    .dc.b    'エディタを起動出来ません',0
  1425. e69:    .dc.b    '0で割ること出来ません',0
  1426. e70:    .dc.b    'date$, time$ へ変な値を代入しないで下さい',0
  1427. e71:    .dc.b    'screen の画面モードが異常です',0
  1428. e72:    .dc.b    'GV-RAM は使用中です',0
  1429. e73:    .dc.b    'console の3番目の引数が規定の範囲を超えています',0
  1430. e74:    .dc.b    '関数の引き数の配列の添字が合いませんのぉ',0
  1431. e75:    .dc.b    '引き数の配列の次元が合いません',0
  1432. e76:    .dc.b    'end がありません',0
  1433. e77:    .dc.b    '引き数に配列なんか使えません',0
  1434. e78:    .dc.b    '指定の行番号はありません',0
  1435. e79:    .dc.b    '使える行番号は 0 から 65535 までなんです',0
  1436. e80:    .dc.b    '変な goto',0
  1437. e81:    .dc.b    'そのラベル名はすでに使用されてます',0
  1438. e82:    .dc.b    'label はちゃんと " でくくってください',0
  1439. e83:    .dc.b    'goto で関数ブロックの外に飛びだしちゃいけません',0
  1440. e84:    .dc.b    '配列の添字の大きさには定数しか使えません',0
  1441. e85:    .dc.b    'global な可変長配列は使えません',0
  1442.     .even
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  * エディタを起動して、タイムスタンプが変わっていたら再実行
  1459. ed起動:
  1460.     move.w    #$23,-(sp)
  1461.     pea.l    basic_filename
  1462.     pea.l    tmp
  1463.     DOS    _FILES
  1464.     lea.l    10(sp),sp
  1465.     bmi    ed起動end
  1466.     move.l    22+tmp,-(sp)
  1467.  
  1468.     lea.l    tmp,a0
  1469.     lea.l    ed_filename,a1
  1470. @@:
  1471.     move.b    (a1)+,(a0)+
  1472.     bne    @b
  1473.     move.b    #' ',-1(a0)
  1474.  
  1475.     lea.l    tag_filename,a1
  1476. @@:
  1477.     move.b    (a1)+,(a0)+
  1478.     bne    @b
  1479.  
  1480.  
  1481.     movem.l    d0-d7/a0-a6,-(sp)
  1482.     clr.l    -(sp)
  1483.     pea.l    $100+tmp
  1484.     pea.l    tmp
  1485.     move.w    #2,-(sp)
  1486.     DOS    _EXEC
  1487.     tst.l    d0
  1488.     bmi    ed起動err
  1489.     clr.w    (sp)
  1490.     DOS    _EXEC
  1491.     lea.l    14(sp),sp
  1492.     movem.l    (sp)+,d0-d7/a0-a6
  1493.  
  1494.     move.w    #$23,-(sp)
  1495.     pea.l    basic_filename
  1496.     pea.l    tmp
  1497.     DOS    _FILES
  1498.     lea.l    10(sp),sp
  1499.     move.l    (sp)+,d0
  1500.     cmp.l    22+tmp,d0
  1501.     rts
  1502. ed起動end:
  1503.     moveq    #-1,d0
  1504.     rts
  1505. ed起動err:
  1506.     clr.l    行数
  1507.     ERROR    68
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  * basic.cnf を読み込んで評価する。
  1513.  * 今のところ " FUNC = " 行のみ有効
  1514.  * d5.w = 関数ファイルの個数
  1515. cnf_read:
  1516.     lea.l    -$4000(sp),sp        * tmp
  1517.     movea.l    sp,a5
  1518.     lea.l    _SP上限(a6),a3
  1519.  
  1520.  * .cnf 読み込み
  1521.     lea.l    cnf_filename,a2
  1522.     tst.b    (a2)
  1523.     beq    1f
  1524.     lea.l    tmp,a0
  1525.     bsr    cnf_sub0
  1526.     bge    @f
  1527.     ERROR    65
  1528. 1:
  1529.     lea.l    xbcnf_file(pc),a2
  1530.     bsr    cnf_sub
  1531.     bge    @f
  1532.     lea.l    cnf_file(pc),a2
  1533.     bsr    cnf_sub
  1534.     bmi    help
  1535. @@:
  1536.  
  1537.     moveq    #0,d5        * 関数ファイルの個数
  1538.     moveq    #1,d0
  1539.     move.l    d0,行数
  1540. cr_loop:
  1541.     bsr    first_check_a5
  1542.  * 数字なら            d0 = 0
  1543.  * ファイル終了なら        d0 = -1
  1544.  * その他なら            d0 = そのキャラクタ
  1545.     tst.w    d0
  1546.     beq    cf_err
  1547.     bmi    cf_end
  1548.  
  1549.     cmpi.b    #'*',d0
  1550.     beq    cnf_cont
  1551.  
  1552.     lea.l    _cnfS(pc),a2        * config の命令 list
  1553.     bsr    fc_check_sub
  1554.  * d6 = 命令番号*2 (-1=該当無い)
  1555.     bmi    cf_err
  1556.  
  1557.     bsr    first_check_a5
  1558.     cmpi.b    #'=',(a5)+
  1559.     bne    cf_err
  1560.  
  1561.     bsr    first_check_a5
  1562.     tst.w    d0
  1563.     bmi    cf_err
  1564.  
  1565.     move.w    cc(pc,d6.w),d6
  1566.     jmp    cc(pc,d6.w)
  1567. cc:
  1568.     .dc.w    Func-cc
  1569.     .dc.w    Beep-cc
  1570.     .dc.w    Caps-cc
  1571.     .dc.w    Free-cc
  1572.     .dc.w    Width-cc
  1573.     .dc.w    Fkey-cc
  1574.     .dc.w    Warn-cc
  1575.     .dc.w    Sinit-cc
  1576.     .dc.w    Tag-cc
  1577.     .dc.w    EdEd-cc
  1578.     .dc.w    Extend-cc
  1579.  
  1580. _cnfS:
  1581.     .dc.b    'func',0
  1582.     .dc.b    'beep',0
  1583.     .dc.b    'caps',0
  1584.     .dc.b    'free',0
  1585.     .dc.b    'width',0
  1586.     .dc.b    'fkey',0
  1587.     .dc.b    'warn',0
  1588.     .dc.b    'sinit',0
  1589.     .dc.b    'tag',0
  1590.     .dc.b    'ed',0
  1591.     .dc.b    'extend',0
  1592.     .dc.b    0
  1593.  
  1594. _cnfT:
  1595.     .dc.b    'on',0        * 0
  1596.     .dc.b    'off',0
  1597.     .dc.b    'always',0    * 4
  1598.     .dc.b    'ask',0
  1599.     .dc.b    'never',0
  1600.     .dc.b    'auto',0    * 10
  1601.     .dc.b    0
  1602.     .even
  1603.  
  1604. Free:
  1605.     movea.l    a5,a0
  1606.     FPACK    __STOL
  1607.     movea.l    a0,a5
  1608.     tst.w    _FREEMEM(a6)
  1609.     bne    cnf_cont
  1610.     move.w    d0,_FREEMEM(a6)
  1611.     bra    cnf_cont
  1612.  
  1613. Beep:
  1614. Caps:
  1615. Width:
  1616.     bra    cnf_cont
  1617.  
  1618. Sinit:
  1619.     lea.l    sinitASK,a1
  1620.     moveq    #2-1,d2
  1621. @@:
  1622.     bsr    first_check_a5_in_line
  1623.     bsr    fc_check_subT
  1624.     subq.w    #4,d6
  1625.     bcs    cf_err
  1626.     cmpi.w    #6,d6
  1627.     bcc    cf_err
  1628.     subq.w    #2,d6
  1629.     move.b    d6,(a1)+
  1630.     dbra    d2,@b
  1631.     bra    cnf_cont
  1632.  
  1633. Fkey:
  1634.     moveq    #fnckeyF,d2
  1635.     bsr    fc_check_subT
  1636.     beq    FkeyOn
  1637.     subq.w    #2,d6        * off
  1638.     beq    FkeyOff
  1639.     subq.w    #8,d6        * auto
  1640.     bne    cf_err
  1641.     bset    #fncautoF,d7
  1642. FkeyOff:
  1643.     bset    d2,d7
  1644.     bra    cnf_cont
  1645. FkeyOn:
  1646.     bclr    d2,d7
  1647.     bra    cnf_cont
  1648.  
  1649. Warn:
  1650.     moveq    #warnoffF,d2
  1651.     bsr    fc_check_subT
  1652.     beq    WarnOn
  1653.     subq.w    #2,d6
  1654.     bne    cf_err
  1655. WarnOff:
  1656.     bset    d2,d7
  1657.     bra    cnf_cont
  1658. WarnOn:
  1659.     bclr    d2,d7
  1660.     bra    cnf_cont
  1661.  
  1662. EdEd:
  1663.     lea.l    ed_filename,a0
  1664.     bra    @f
  1665. Tag:
  1666.     lea.l    tag_filename,a0
  1667. @@:
  1668.     move.b    (a5)+,d0
  1669.     cmpi.b    #$20,d0
  1670.     bcs    @f
  1671.     move.b    d0,(a0)+
  1672.     bra    @b
  1673. @@:
  1674.     clr.b    (a0)+
  1675.     subq.l    #1,a5
  1676.     bra    cnf_cont
  1677.  
  1678.  
  1679. Extend:
  1680.     clr.w    d0
  1681.     move.b    (a5)+,d0
  1682.     cmpi.b    #$20,d0
  1683.     bcs    @f
  1684.     ori.b    #$20,d0
  1685.     subi.b    #'a',d0
  1686.     bcs    cf_err
  1687.     cmpi.b    #'z'-'a',d0
  1688.     bhi    cf_err
  1689.     move.b    _ext_flag(pc,d0.w),d0
  1690.     beq    cf_err
  1691.     bset    d0,d7
  1692.     bra    Extend
  1693. @@:
  1694.     subq.l    #1,a5
  1695.     bra    cnf_cont
  1696. _ext_flag:
  1697.     .dc.b    b_argF    * a
  1698.     .dc.b    0,breakoffF,fnc_dimF,len_dimF,0    * b,c,d,e
  1699.     .dc.b    0,0,v_initF,0,0        * g,h,i
  1700.     .dc.b    labelF,0,0,0,0        * l
  1701.     .dc.b    0,0,0,0,0
  1702.     .dc.b    0,0,0,0,0
  1703.  
  1704.  
  1705. Func:
  1706.     addq.l    #1,d5        * 関数ファイルの個数 ++
  1707. @@:
  1708.     move.b    (a5)+,d0
  1709.     cmpi.b    #$20,d0
  1710.     bcs    @f
  1711.     move.b    d0,(a3)+
  1712.     bra    @b
  1713. @@:
  1714.     clr.b    (a3)+
  1715.     subq.l    #1,a5
  1716. *    bra    cnf_cont
  1717.  
  1718. cnf_cont:
  1719.     bsr    行末まで飛ばし
  1720.     bra    cr_loop
  1721.  
  1722.  
  1723.  
  1724. cf_end:
  1725.     subq.w    #1,d5        * 関数ファイルの個数 - 1
  1726.     move.w    d5,関数file数
  1727.  
  1728.     tst.b    ed_filename
  1729.     beq    1f
  1730.     lea.l    tag_filename,a0
  1731.     tst.b    (a0)
  1732.     bne    1f
  1733.     lea.l    _tag(pc),a1
  1734. @@:
  1735.     move.b    (a1)+,(a0)+
  1736.     bne    @b
  1737. 1:
  1738.     lea.l    $4000(sp),sp
  1739.     rts
  1740.  
  1741. cf_err:
  1742.     clr.b    basic_filename
  1743.     clr.b    ed_filename
  1744.     ERROR    14
  1745.  
  1746. _tag:    .dc.b    'xb.err',0
  1747.     .even
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  * .cnf の読み込み
  1756. cnf_sub:
  1757.     lea.l    tmp,a0
  1758.     lea.l    起動dir,a1
  1759. @@:
  1760.     move.b    (a1)+,(a0)+
  1761.     bne    @b
  1762.     subq.l    #1,a0
  1763. cnf_sub0:
  1764.     move.b    (a2)+,(a0)+
  1765.     bne    cnf_sub0
  1766.  
  1767.     clr.w    -(sp)
  1768.     pea.l    tmp
  1769.     DOS    _OPEN
  1770.     addq.l    #6,sp
  1771.     tst.l    d0
  1772.     bmi    cnf_ret
  1773.  
  1774.     move.l    #$4000-1,-(sp)    * .cnf size の上限 $4000-1 (問題ないでしょう)
  1775.     move.l    a5,-(sp)
  1776.     move.w    d0,-(sp)
  1777.     DOS    _READ
  1778.     clr.b    (a5,d0.l)
  1779.     DOS    _CLOSE
  1780.     lea.l    10(sp),sp
  1781.     moveq    #0,d0
  1782. cnf_ret:
  1783.     rts
  1784.  
  1785.  
  1786.  
  1787.  
  1788. fc_check_subT:
  1789.     lea.l    _cnfT(pc),a2
  1790. fc_check_sub:
  1791.     moveq    #0,d6
  1792. fc_check2:
  1793.     tst.b    (a2)
  1794.     beq    fc_checkend
  1795.     movea.l    a5,a0
  1796. @@:
  1797.     move.b    (a2)+,d0
  1798.     beq    fc_ok
  1799.     moveq    #$20,d1
  1800.     or.b    (a0)+,d1
  1801.     cmp.b    d1,d0
  1802.     beq    @b
  1803. @@:
  1804.     tst.b    (a2)+        * 次へ
  1805.     bne    @b
  1806.     addq.w    #2,d6
  1807.     bra    fc_check2
  1808. fc_ok:
  1809.     moveq    #$20,d1
  1810.     or.b    (a0),d1        * 英字以外でないと
  1811.     cmpi.b    #'a',d1
  1812.     bcs    @f
  1813.     cmpi.b    #'z',d1
  1814.     bcs    fc_checkend
  1815. @@:
  1816.     movea.l    a0,a5
  1817.     tst.w    d6        * 0 以上
  1818.     rts
  1819. fc_checkend:
  1820.     moveq    #-1,d6
  1821.     rts
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832. func_read:
  1833.     move.w    関数file数,d5
  1834.     move.l    a4,関数list
  1835.     movea.l    a4,a3        * 関数ファイルのリスト
  1836.     move.w    d5,d0
  1837.     bmi    fnc_整理整頓
  1838.     lsl.w    #2,d0
  1839.     lea.l    4(a4,d0.w),a4    * +  4+4*(関数の個数 - 1)
  1840.  
  1841.     lea.l    _SP上限(a6),a2
  1842. fr_loop:
  1843.     lea.l    tmp,a0        * '=' の後ろ
  1844.  
  1845. .ifndef    _DEBUG            * _DEBUG が定義されてなければ
  1846.     lea.l    起動dir,a1    * 起動ディレクトリから探す
  1847. @@:
  1848.     move.b    (a1)+,(a0)+
  1849.     bne    @b
  1850.     subq.l    #1,a0
  1851. .endif
  1852.  
  1853. @@:
  1854.     move.b    (a2)+,(a0)+
  1855.     bne    @b
  1856.     move.b    #'.',-1(a0)
  1857.     move.b    #'f',(a0)+
  1858.     move.b    #'n',(a0)+
  1859.     move.b    #'c',(a0)+
  1860.     clr.b    (a0)
  1861.  
  1862. .ifdef    _DEBUG            * _DEBUG が定義されてると
  1863.     clr.l    -(sp)        * PATH の通ったディレクトリから探す
  1864.     pea.l    $100+tmp
  1865.     pea.l    tmp
  1866.     move.w    #2,-(sp)
  1867.     DOS    _EXEC
  1868.     lea.l    14(sp),sp
  1869.     tst.l    d0
  1870.     bmi    fnc_err
  1871. .endif
  1872.     move.l    mem_last,-(sp)    * limit address
  1873.     move.l    a4,-(sp)
  1874.     pea.l    tmp
  1875.     move.b    #3,(sp)        * X 形式のファイルとして読み込み
  1876.     move.w    #3,-(sp)
  1877.     DOS    _EXEC
  1878.     lea.l    14(sp),sp
  1879.     tst.l    d0
  1880.     ble    fnc_err
  1881.  
  1882.     * 登録
  1883.     move.l    a4,(a3)+
  1884. *    addq.l    #3,d0
  1885. *    andi.b    #$fc,d0        * あんまり関係ないからいらない?
  1886.     adda.l    d0,a4
  1887.  
  1888.     dbra    d5,fr_loop
  1889.  
  1890.  
  1891. fnc_整理整頓:
  1892.  * 読み込みが終了したので、外部関数の整理整頓をする。
  1893.     moveq    #-1,d6        * 関数の個数 - 1
  1894.  
  1895.     movea.l    関数list,a3
  1896.     move.l    a4,関数buf
  1897.     lea.l    _SP上限(a6),a4
  1898.  
  1899.     .xref    standard_init
  1900.     bsr    standard_init
  1901.  
  1902.     move.w    関数file数,d5
  1903.     bmi    fnc_end2
  1904. func_init_loop:
  1905.     movea.l    (a3)+,a0
  1906.     move.l    Ftokun(a0),a5
  1907.     movem.l    Fpara(a0),a0-a1
  1908.         * a5 = トークン    テーブルの先頭アドレス
  1909.         * a0 = パラメータ
  1910.         * a1 = 実行アドレス
  1911.     move.w    d5,-(sp)
  1912.     bsr    func_hash
  1913.     move.w    (sp)+,d5
  1914.     dbra    d5,func_init_loop
  1915. fnc_end2:
  1916.     movea.l    関数buf,a4
  1917.     move.w    d6,関数個数
  1918.  
  1919.     lea.l    _SP上限(a6),a3        * とりあえず作った関数テーブル
  1920.     lea.l    外部functable,a5    * 本物の関数テーブルを格納
  1921.     bsr    func_sort
  1922.     rts
  1923.  
  1924. fnc_err:
  1925.     move.w    #-1,関数file数
  1926.     cmpi.w    #$fff8,d0    * メモリが足りない
  1927.     beq    mem_err
  1928.     ERROR    15
  1929.  
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  * a3 から始まる (d6+1) 個のハッシュ値付きのテーブルを a4 に並べ直す。
  1936.  * a5 に参照用テーブルを作る
  1937. func_sort:
  1938.     move.w    d6,d4
  1939.     addq.w    #1,d4
  1940.     lsl.w    #2,d4
  1941.     suba.w    d4,sp
  1942.     movea.l    sp,a0
  1943.     move.w    d6,d0
  1944. @@:
  1945.     move.l    a3,(a0)+
  1946.     lea.l    $10(a3),a3
  1947.     dbra    d0,@b
  1948.  
  1949.  
  1950.     move.w    d6,d2
  1951.     subq.w    #1,d2
  1952.     bmi    fs_loop_end
  1953.     lea.l    4(sp),a3
  1954. fs_loop:
  1955.     movea.l    (a3),a0
  1956.     move.b    1(a0),d0
  1957.     move.w    d6,d5
  1958.     sub.w    d2,d5
  1959.     subq.w    #1,d5
  1960.     movea.l    a3,a2
  1961. @@:
  1962.     movea.l    -(a2),a1
  1963.     cmp.b    1(a1),d0    * hash の下1バイト
  1964.     bcc    @f
  1965.     move.l    a1,4(a2)
  1966.     dbra    d5,@b
  1967.     subq.l    #4,a2
  1968. @@:
  1969.     move.l    a0,4(a2)
  1970.     addq.l    #4,a3
  1971.     dbra    d2,fs_loop
  1972.  
  1973. fs_loop_end:
  1974.  
  1975.     moveq    #0,d0
  1976.     moveq    #-1,d1
  1977.     moveq    #0,d2
  1978.     movea.l    sp,a1
  1979.     clr.w    (a5)+    * 関数buf からのオフセット
  1980.  
  1981. fs_2:
  1982.     movea.l    (a1)+,a0
  1983. @@:
  1984.     cmp.b    1(a0),d0
  1985.     beq    fs_1
  1986.  
  1987.     move.w    d1,(a5)+    * 個数
  1988.     move.w    d2,(a5)+    * 関数buf からのオフセット
  1989.  
  1990.     addq.b    #1,d0
  1991.     moveq    #-1,d1
  1992.     bra    @b
  1993.  
  1994. fs_1:
  1995.     move.l    (a0)+,(a4)+
  1996.     move.l    (a0)+,(a4)+
  1997.     move.l    (a0)+,(a4)+
  1998.     move.l    (a0)+,(a4)+
  1999.     addq.w    #1,d1
  2000.     add.w    #$10,d2
  2001.     dbra    d6,fs_2
  2002.  
  2003.     move.w    d1,(a5)+    * 個数
  2004.     move.w    #$100-2,d1
  2005.     sub.w    d0,d1
  2006.     bmi    fs_3
  2007.     moveq    #-1,d0
  2008. @@:
  2009.     move.l    d0,(a5)+    * 残りを埋める
  2010.     dbra    d1,@b
  2011.  
  2012. fs_3:
  2013.     adda.w    d4,sp
  2014.     rts
  2015.  
  2016.  
  2017.  
  2018.  
  2019.  * (a5) から始まるトークンリストからハッシュ値を計算してテーブルを作る
  2020. func_hash:
  2021.     tst.b    (a5)
  2022.     beq    fi_loop1_end
  2023. fi_loop1:
  2024.     bsr    hash
  2025.  * a2.l = 元の対象の開始アドレス
  2026.  * d4.l = (hash.w)(文字数 - 1)
  2027.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  2028.     move.l    a2,(a4)+    * 名前
  2029.     move.l    (a0)+,(a4)+    * パラメータリストを指すポインタ
  2030.     move.l    (a1)+,(a4)+    * 実行アドレス
  2031.  * おんなじ名前の関数もあるかもしれないが、そのまま登録してまおう
  2032.  * 上から一致を見ていくから、先に登録したものが優先となるはず
  2033.  
  2034.     addq.w    #1,d6
  2035.     addq.l    #1,a5        * $00
  2036.  
  2037.     tst.b    (a5)
  2038.     bne    fi_loop1
  2039. fi_loop1_end:
  2040.     rts
  2041.  
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  * プログラム全体から 'func' の文字列を探しだし、
  2058.  * 内部関数の宣言なら登録する。
  2059. 内部関数:
  2060.     move.l    a4,内部関数para
  2061.  
  2062.     lea.l    -$10*$400(sp),sp    * 内部関数の個数の上限 1024 (大丈夫……かな?)
  2063.     movea.l    sp,a4        * 内部関数buf_tmp
  2064.     move.l    a4,内部関数buf
  2065.  
  2066.     lea.l    tmp,a0        * func を探すための BM法テーブル
  2067.     move.l    #$04040404,d0
  2068.     moveq    #32/4-1,d1
  2069. @@:
  2070.     move.l    d0,(a0)+
  2071.     dbra    d1,@b
  2072.     move.l    #$05050505,d0
  2073.     moveq    #(256-32)/4-1,d1
  2074. @@:
  2075.     move.l    d0,(a0)+
  2076.     dbra    d1,@b
  2077.  
  2078.     lea.l    tmp,a0
  2079.     move.b    #4,' '(a0)
  2080.     move.b    #3,'f'(a0)
  2081.     move.b    #2,'u'(a0)
  2082.     move.b    #1,'n'(a0)
  2083.     clr.b    'c'(a0)
  2084.  
  2085.     move.w    #-1,内部関数個数
  2086.  
  2087.     addq.l    #4,a5
  2088. search_func_loop:
  2089.     clr.w    d0
  2090.     move.b    (a5),d0
  2091.     move.b    (a0,d0.w),d0
  2092.     bne    func_next
  2093.  
  2094.     moveq    #4+1,d0
  2095.     movea.l    a5,a1
  2096.     cmpi.b    #'n',-(a1)
  2097.     bne    func_next
  2098.     cmpi.b    #'u',-(a1)
  2099.     bne    func_next
  2100.     cmpi.b    #'f',-(a1)
  2101.     bne    func_next
  2102.  
  2103. @@:
  2104.     move.b    -(a1),d1    * 前の文字は空白・行番号を飛ばすと改行 ($a) でなきゃ
  2105.     cmpi.b    #32,d1
  2106.     beq    @b
  2107.     cmpi.b    #9,d1
  2108.     beq    @b
  2109.     cmpi.b    #'9',d1
  2110.     bhi    func_next
  2111.     cmpi.b    #'0',d1
  2112.     bcc    @b
  2113.  
  2114.     cmpi.b    #$a,d1
  2115.     bne    func_next
  2116.  
  2117.     move.b    1(a5),d1    * 次の文字(空白・TAB)
  2118.     cmpi.b    #' ',d1
  2119.     beq    func_hit
  2120.     cmpi.b    #9,d1
  2121.     bne    func_next
  2122. func_hit:
  2123.     movem.l    a0/a2,-(sp)
  2124.     bsr    内部関数登録
  2125.     movem.l    (sp)+,a0/a2
  2126.     moveq    #4,d0
  2127. func_next:
  2128.     adda.w    d0,a5
  2129.     cmpa.l    a2,a5
  2130.     bcs    search_func_loop
  2131.  
  2132.     movea.l    内部関数para,a4
  2133.     move.l    a4,内部関数buf
  2134.     move.w    内部関数個数,d1        * buf_tmp からコピー
  2135.     bmi    1f
  2136.     movea.l    sp,a0
  2137. @@:
  2138.     move.l    (a0)+,(a4)+
  2139.     move.l    (a0)+,(a4)+
  2140.     move.l    (a0)+,(a4)+
  2141.     move.l    (a0)+,(a4)+
  2142.     dbra    d1,@b
  2143. 1:
  2144.     lea.l    $10*$400(sp),sp
  2145.     rts
  2146.  
  2147.  
  2148.  
  2149.  
  2150. 内部関数登録:
  2151.     addq.l    #1,a5
  2152.  * 型を得る(省略なら int )
  2153.     bsr    型getS
  2154.  *         (INT,STR,CHAR,FLOAT)
  2155.  * d1.w  型を返す(  0,  2,   4,    6)
  2156.     move.w    d1,-(sp)
  2157.  
  2158.     bsr    first_check_a5_in_line
  2159.  * ハッシュ値を計算しながら、文字数を数える
  2160.     bsr    hash
  2161.  * a2.l = 元の対象の開始アドレス
  2162.  * d4.l = (hash.w)(文字数-1)
  2163.     tst.w    d4
  2164.     bmi    func文err
  2165.  
  2166.     bsr    statement_check
  2167.  * 一致しなければ    d0 = 0
  2168.     tst.w    d0
  2169.     bne    func_double_def
  2170.  
  2171.     bsr    function_check
  2172.  * d0.w = ヒットした関数の返り値の型    ( = 0 : 該当関数無し )
  2173.     tst.w    d0
  2174.     bne    func_double_def0
  2175.  
  2176.  
  2177.  
  2178.  * 内部関数登録
  2179.     addq.w    #1,内部関数個数
  2180.  
  2181.     move.l    d4,(a4)+    * (hash.w)(文字数 - 1)
  2182.     bsr    名前登録    * a2,d4 破壊
  2183.     move.l    a0,(a4)+    * 名前
  2184.  
  2185.     movea.l    内部関数para,a3
  2186.     move.l    a3,(a4)+    * パラメータリストを指すポインタ
  2187.     clr.l    (a4)+        * 実行アドレス(念のためクリアしとく)
  2188.  
  2189.  
  2190.     cmpi.b    #'(',(a5)+
  2191.     bne    func文err0
  2192.     bsr    first_check_a5_in_line
  2193.     cmpi.b    #')',d0
  2194.     beq    内部関数登録loop_end
  2195.  
  2196. 内部関数登録loop:
  2197.     bsr    first_check_a5_in_line
  2198.     bsr    hash        * 引き数名(今は無視)
  2199.  
  2200.     cmpi.b    #'(',(a5)
  2201.     bne    @f
  2202.         bsr    配列引き数
  2203.         bra    内部関数登録cont
  2204.  
  2205. @@:
  2206.     moveq    #$0,d1        * int引き数
  2207. *    bsr    first_check_a5_in_line
  2208.     cmpi.b    #';',(a5)
  2209.     bne    @f
  2210.  
  2211.     addq.l    #1,a5
  2212.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  2213.  * d0    = 0 省略せず
  2214.  *    = 1 省略
  2215.     bne    func文err0
  2216. @@:
  2217.     move.w    _引き数の型(pc,d1.w),(a3)+
  2218.  
  2219. 内部関数登録cont:
  2220.     bsr    first_check_a5_in_line
  2221.     addq.l    #1,a5
  2222.     cmpi.b    #',',d0
  2223.     beq    内部関数登録loop
  2224.  
  2225.     cmpi.b    #')',d0
  2226.     bne    func文err0
  2227. 内部関数登録loop_end:
  2228.     move.w    (sp)+,d1        * 返り値の型
  2229.     move.w    _返り値の型(pc,d1.w),(a3)+
  2230.     move.l    a3,内部関数para
  2231.     rts
  2232.  
  2233. _引き数の型:
  2234.     .dc.w    $0002,$0008,$0004,$0001
  2235. _返り値の型:
  2236. *    .dc.w    int_ret,str_ret,char_ret,float_ret
  2237.     .dc.w    $8001,$8003,$8002,$8000
  2238.     *            ^^^^^ 新設
  2239.  
  2240.  
  2241.  
  2242. 配列引き数:
  2243.     btst    #fnc_dimF,d7
  2244.     beq    配列引き数err
  2245.  
  2246.     movem.l    d2/d3,-(sp)
  2247.     moveq    #-1,d1        * 次元 - 1
  2248.     moveq    #0,d2        * 添字大きさ指定フラグ
  2249.     lea.l    6(a3),a2    * $8080.w, 型.b, 次元-1.b, 添字flag.w
  2250. @@:
  2251.     addq.l    #1,a5        * '(',','
  2252.     bsr    first_check_a5_in_line
  2253.     cmpi.b    #')',d0
  2254.     beq    2f
  2255.     cmpi.b    #',',d0
  2256.     bne    1f
  2257.         addq.w    #1,d1        * 次元++
  2258.         clr.w    (a2)+        * 一応
  2259.         bra    @b
  2260. 1:
  2261.     bsr    int定数get    * 添字大きさ
  2262.     cmpi.l    #$10000,d0
  2263.     bcc    func文err0
  2264.  
  2265.     addq.w    #1,d1        * 次元++
  2266.     move.w    d0,(a2)+
  2267.     moveq    #$f,d0
  2268.     sub.w    d1,d0
  2269.     bset    d0,d2        * 添字大きさ指定フラグ set
  2270.  
  2271.     bsr    first_check_a5_in_line
  2272.     cmpi.b    #')',d0
  2273.     beq    3f
  2274.     cmpi.b    #',',d0
  2275.     beq    @b
  2276.     bra    func文err0
  2277.  
  2278. 2:
  2279.     addq.w    #1,d1        * 次元++
  2280.     clr.w    (a2)+        * 一応
  2281. 3:
  2282.     addq.l    #1,a5
  2283.     tst.w    d2
  2284.     bne    拡張配列引き数    * 添字大きさ指定フラグが一個でもあれば
  2285.     cmpi.w    #1,d1
  2286.     bhi    拡張配列引き数    * 三次元以上なら
  2287.  
  2288.     beq    @f
  2289.         moveq    #$0020,d2    *普通の1次元
  2290.         bra    1f
  2291. @@:
  2292.         moveq    #$0040,d2    *普通の2次元
  2293. 1:
  2294.     moveq    #$0,d1        * int引き数
  2295.     bsr    first_check_a5_in_line
  2296.     cmpi.b    #';',d0
  2297.     bne    @f
  2298.  
  2299.     addq.l    #1,a5
  2300.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  2301.  * d0    = 0 省略せず
  2302.  *    = 1 省略
  2303.     bne    func文err0
  2304. @@:
  2305.     lea.l    _引き数の型(pc),a0
  2306.     add.w    (a0,d1.w),d2        * 2次元以下配列型指定
  2307.     move.w    d2,(a3)+
  2308.     movem.l    (sp)+,d2/d3
  2309.     rts
  2310.  
  2311.  
  2312. 拡張配列引き数:
  2313.     cmpi.w    #10,d1
  2314.     bcc    func文err0        * 11次元以上
  2315.  
  2316.     move.l    a2,-(sp)
  2317.     move.w    #$8080,(a3)+    * 拡張配列引き数
  2318.  
  2319.     bsr    first_check_a5_in_line
  2320.  
  2321.     moveq    #0,d0        * int
  2322.     cmpi.b    #';',(a5)
  2323.     bne    @f
  2324.     addq.l    #1,a5
  2325.     movem.l    d1/a1,-(sp)
  2326.     bsr    型getS        * d0/d1:return, a0/a2:破壊
  2327.  * d0    = 0 省略せず
  2328.  *    = 1 省略
  2329.     bne    func文err0
  2330.     move.w    _引き数の型2(pc,d1.w),d0
  2331.     movem.l    (sp)+,d1/a1
  2332. @@:
  2333.     or.w    d1,d0
  2334.     move.w    d0,(a3)+    * 型+次元-1
  2335.     move.w    d2,(a3)+    * 添字大きさ指定フラグ
  2336.     movea.l    (sp)+,a3
  2337.     movem.l    (sp)+,d2/d3
  2338.     rts
  2339. _引き数の型2:
  2340.     .dc.w    $0000,$0100,$0200,$8000
  2341.  
  2342.  
  2343.  
  2344.  
  2345. 配列引き数err:
  2346.     bsr    line算出
  2347.     ERRORS    77        * 配列名を表示
  2348. func文err0:
  2349.     movea.l    -$10+4(a4),a2
  2350.     move.w    -$10+2(a4),d4
  2351.     bsr    line算出
  2352.     ERRORS    39        * 関数名を表示
  2353. func文err:
  2354.     bsr    line算出
  2355.     ERROR    39
  2356. func_double_def0:
  2357.     movea.l    -$10+4(a3),a2
  2358.     move.w    -$10+2(a3),d4
  2359. func_double_def:
  2360.     bsr    line算出
  2361.     ERRORS    40
  2362.  
  2363.  * 何行目かを出す
  2364. line算出:
  2365.     move.l    a5,d1
  2366.     sub.l    program_area,d1
  2367.     moveq    #1,d2
  2368. line算出loop:
  2369.     cmpi.b    #$a,-(a5)
  2370.     bne    @f
  2371.     addq.l    #1,d2
  2372. @@:
  2373.     subq.l    #1,d1
  2374.     bne    line算出loop
  2375.     move.l    d2,行数
  2376.     rts
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399.  
  2400.     .xdef    fnc書替sub
  2401. fnc書替sub:
  2402.     bclr    #fnckeyF,d7    * FKEY 書き替えるよ
  2403.     beq    @f
  2404.     btst    #fncautoF,d7
  2405.     bne    @f
  2406.     bset    #fnckeyF,d7    * やっぱり書き替えないよ
  2407.     bset    #fncwarnF,d7
  2408.     bne    @f
  2409.     WARN    67
  2410. @@:
  2411.     rts
  2412. FKEY戻す:
  2413.     tst.w    fkeyflag
  2414.     beq    @f
  2415.     pea.l    b_initbuf
  2416.     move.w    #$100,-(sp)
  2417.     DOS    _FNCKEY
  2418.     addq.l    #6,sp
  2419. @@:
  2420.     rts
  2421.     .xdef    FKEYset
  2422. FKEYset:
  2423.     bsr    make_keydata
  2424.     btst    #fnckeyF,d7
  2425.     bne    @f
  2426.     pea.l    b_initbuf
  2427.     clr.w    -(sp)
  2428.     DOS    _FNCKEY
  2429.     pea.l    _SP上限(a6)
  2430.     move.w    #$100,-(sp)
  2431.     DOS    _FNCKEY
  2432.     lea.l    12(sp),sp
  2433.     move.w    #-1,fkeyflag
  2434. @@:
  2435.     rts
  2436.  
  2437.  
  2438. make_keydata:
  2439.     lea.l    _b_keydata(pc),a1
  2440.     lea.l    _SP上限(a6),a2
  2441.     moveq    #0,d0
  2442.     moveq    #(($20*20)+(6*12))/8-1,d1
  2443.     movea.l    a2,a0
  2444. @@:
  2445.     move.l    d0,(a0)+
  2446.     move.l    d0,(a0)+
  2447.     dbra    d1,@b
  2448.  
  2449.     moveq    #10-1,d1
  2450. 1:
  2451.     movea.l    a2,a0
  2452. @@:
  2453.     move.b    (a1)+,(a0)+
  2454.     bne    @b
  2455.     lea.l    $20(a2),a2
  2456.     dbra    d1,1b
  2457.     lea.l    $20*10(a2),a2
  2458.  
  2459.     moveq    #12-1,d1
  2460. @@:
  2461.     move.b    (a1)+,(a2)
  2462.     addq.l    #6,a2
  2463.     dbra    d1,@b
  2464.  
  2465.     rts
  2466.  
  2467.  
  2468.  * XC ver.2 のライブラリのソース KEYDATA.S から改変
  2469. _b_keydata:
  2470.     dc.b    'files ',13,0
  2471.     dc.b    'load ',13,0
  2472.     dc.b    'auto ',0
  2473.     dc.b    'list ',13,0
  2474.     dc.b    'run ',13,0
  2475.     dc.b    '/*',0
  2476.     dc.b    'width ',0
  2477.     dc.b    'end',0
  2478.     dc.b    'func ',0
  2479.     dc.b    'system',0
  2480.     dc.b    $0e,$0f,$01,$7f,$1e,$1d,$1c,$1f,$0c,$16,$0b,$15
  2481.     .even
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  * 外部関数のさまざまなルーチンを呼ぶ
  2487. Fルーチン:
  2488.     movem.l    d0-d7/a0-a6,-(sp)
  2489.     move.w    関数file数,d0
  2490.     bmi    no_func_file1
  2491.     movea.l    関数list,a5
  2492. @@:
  2493.     movea.l    (a5)+,a0
  2494.     move.l    (a0,d1.w),a0
  2495.     movem.l    d0/d1/a5,-(sp)
  2496.     jsr    (a0)            * run 実行時の初期化ルーチン
  2497.     movem.l    (sp)+,d0/d1/a5
  2498.     dbra    d0,@b
  2499. no_func_file1:
  2500.     movem.l    (sp)+,d0-d7/a0-a6
  2501.     rts
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  * コマンドラインの評価
  2511. com_est:
  2512.     tst.b    (a2)+
  2513.     beq    help
  2514.  
  2515. ce_loop:
  2516.     move.b    (a2)+,d0
  2517.     beq    help
  2518.     cmpi.b    #$20,d0
  2519.     bls    ce_loop
  2520.     cmpi.b    #'-',d0
  2521.     bne    ce_file
  2522.  
  2523.     moveq    #$20,d0
  2524.     or.b    (a2)+,d0
  2525.     cmpi.b    #'c',d0
  2526.     beq    sw_c
  2527.     cmpi.b    #'e',d0
  2528.     beq    sw_e
  2529.     cmpi.b    #'f',d0
  2530.     beq    sw_f
  2531. .ifdef    _DEBUG
  2532.     cmpi.b    #'d',d0
  2533.     beq    sw_d
  2534. .endif
  2535.     bra    help
  2536.  
  2537.  
  2538. sw_f:
  2539.     movea.l    a2,a0
  2540.     FPACK    __STOL
  2541.     movea.l    a0,a2
  2542.     move.w    d0,_FREEMEM(a6)
  2543.     bra    ce_loop
  2544.  
  2545. sw_e:
  2546.     movem.l    EXTENDmask,d1/d2        * OFFmask/ONmask
  2547.     lea.l    _ext_flag(pc),a0
  2548. @@:
  2549.     move.b    (a2)+,d0
  2550.     subi.b    #'A',d0
  2551.     bcs    sw_e_end
  2552.     cmpi.b    #26,d0
  2553.     bcc    sw_e_off
  2554.     move.b    (a0,d0.w),d0
  2555.     beq    help
  2556.     bset    d0,d2        * ONmask
  2557.     bra    @b
  2558. sw_e_off:
  2559.     subi.b    #'a'-'A',d0
  2560.     bcs    help
  2561.     cmpi.b    #26,d0
  2562.     bcc    sw_e_off
  2563.     move.b    (a0,d0.w),d0
  2564.     beq    help
  2565.     bclr    d0,d1        * OFFmask
  2566.     bra    @b
  2567.  
  2568. sw_e_end:
  2569.     movem.l    d1/d2,EXTENDmask
  2570.     subq.l    #1,a2
  2571.     bra    ce_loop
  2572.  
  2573. sw_c:
  2574.     lea.l    cnf_filename,a0
  2575.     bsr    ce_sub0
  2576.     bra    ce_loop
  2577.  
  2578. .ifdef    _DEBUG
  2579. sw_d:
  2580.     movea.l    a2,a0
  2581.     FPACK    __STOL
  2582.     movea.l    a0,a2
  2583.     lea.l    break行数(pc),a0
  2584.     move.l    d0,(a0)
  2585.     bra    ce_loop
  2586. break行数:    .dc.l    -1
  2587. .endif
  2588.  
  2589. ce_file:
  2590.     subq.l    #1,a2
  2591.     lea.l    basic_filename,a0
  2592.     bsr    ce_sub
  2593. *    move.l    a2,command_line
  2594. *    move.l    command_line,a2
  2595.     bsr    b_argv展開
  2596.     rts
  2597.  
  2598.  
  2599.  
  2600.  
  2601. b_argv展開:
  2602.     addq.l    #2,a4        * 項目をロングワード境界に
  2603.     move.l    a4,b_argv
  2604.  
  2605.     clr.l    (a4)+            * 次を指す offset  (dummy)
  2606.     move.l    #$0000_00ff,(a4)+    * (次元 - 1)_(データサイズ)
  2607.     move.l    a4,-(sp)
  2608.     addq.l    #2,a4            * 要素数
  2609.  
  2610.     lea.l    _SP上限(a6),a1
  2611.     move.l    a1,-(sp)
  2612.     pea.l    basic_filename
  2613.     DOS    _NAMECK
  2614.     addq.l    #8,sp
  2615.  
  2616.     movea.l    a4,a0
  2617.     bsr    barg_sub        * drive & path
  2618.     lea.l    2+65+_SP上限(a6),a1
  2619.     bsr    barg_sub        * file name
  2620.     lea.l    2+65+19+_SP上限(a6),a1
  2621.     bsr    barg_sub        * ext name
  2622.     lea.l    $100(a4),a4
  2623.     moveq    #0,d1        * 要素数
  2624.  
  2625. barg_loop:
  2626.     tst.b    (a2)
  2627.     beq    barg_end
  2628.     movea.l    a4,a0
  2629.     bsr    ce_sub
  2630.     lea.l    $100(a4),a4
  2631.     addq.w    #1,d1        * 要素数
  2632.     bra    barg_loop
  2633. barg_end:
  2634.     movea.l    (sp)+,a0
  2635.     move.w    d1,(a0)
  2636.     addq.w    #1,d1
  2637.     move.l    d1,b_argc
  2638.     rts
  2639.  
  2640.  
  2641. barg_sub:
  2642.     move.b    (a1)+,(a0)+
  2643.     bne    barg_sub
  2644.     subq.l    #1,a0
  2645.     rts
  2646.  
  2647.  
  2648.  
  2649.  
  2650. ce_sub0:
  2651.     move.b    (a2)+,d0
  2652.     beq    help
  2653.     cmpi.b    #$20,d0
  2654.     bls    ce_sub0
  2655.     subq.l    #1,a2
  2656. ce_sub:
  2657.     move.b    (a2)+,d0
  2658.     cmpi.b    #$20,d0
  2659.     bls    @f
  2660.     move.b    d0,(a0)+
  2661.     bra    ce_sub
  2662. @@:
  2663.     clr.b    (a0)
  2664.     subq.l    #1,a2
  2665. @@:
  2666.     move.b    (a2)+,d0
  2667.     beq    @f
  2668.     cmpi.b    #$20,d0
  2669.     bls    @b
  2670. @@:
  2671.     subq.l    #1,a2
  2672.     rts
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  * テキストのパレット初期化        * by Eriko Tachibana
  2679.     .xdef    init_tpal
  2680. init_tpal:
  2681.     moveq    #3,d1
  2682.     moveq    #-2,d2            * システムの既定値 の意
  2683. @@
  2684.     IOCS    _TPALET            * 一応
  2685.     dbra    d1,@b
  2686.     rts
  2687.  
  2688.  
  2689.  
  2690.  
  2691.     .xdef    最左カラム
  2692. 最左カラム:
  2693.     movem.l    d0-d2,-(sp)
  2694.     moveq    #-1,d1
  2695.     IOCS    _B_LOCATE
  2696.     swap    d0
  2697.     tst.w    d0
  2698.     beq    @f
  2699.     pea.l    crlf(pc)    * カーソルを画面最左カラムに
  2700.     DOS    _PRINT
  2701.     addq.l    #4,sp
  2702. @@:
  2703.     movem.l    (sp)+,d0-d2
  2704.     rts
  2705.  
  2706.  
  2707.  
  2708.     .xdef    dec_print
  2709. dec_print:
  2710.     movem.l    d0-d2/a0,-(sp)
  2711.     move.l    4+4*4(sp),d2
  2712.     bmi    dec_minus
  2713.  
  2714.     bsr    DECP
  2715.     move.b    #$20,-(a0)
  2716.     bra    dec_plus
  2717.  
  2718. dec_minus:
  2719.     neg.l    d2
  2720.     bsr    DECP
  2721.     move.b    #'-',-(a0)
  2722. dec_plus:
  2723.     move.l    a0,-(sp)
  2724.     DOS    _PRINT
  2725.     addq.l    #4,sp
  2726.  
  2727.     movem.l    (sp)+,d0-d2/a0
  2728.     rts
  2729.  
  2730.  
  2731.  
  2732. DECP:
  2733.     lea.l    $100+tmp,a0
  2734.     move.w    #$20_00,-(a0)
  2735.     moveq    #10,d1
  2736. decp2:
  2737.  
  2738.     swap    d2
  2739.     moveq    #0,d0
  2740.     move.w    d2,d0
  2741.     divu    d1,d0
  2742.     beq    decp3
  2743.     move.w    d0,d2
  2744.     swap    d2
  2745.     move.w    d2,d0
  2746.     divu    d1,d0
  2747.     move.w    d0,d2
  2748.     swap    d0
  2749.  
  2750.     addi.b    #$30,d0
  2751.     move.b    d0,-(a0)
  2752.     bra    decp2
  2753.  
  2754. decp3:
  2755.     swap    d2
  2756. decp4:
  2757.     divu    d1,d2
  2758.     swap    d2
  2759.     addi.b    #$30,d2
  2760.     move.b    d2,-(a0)
  2761.     clr.w    d2
  2762.     swap    d2
  2763.     bne    decp4
  2764.  
  2765.     rts
  2766.  
  2767.  
  2768.  
  2769.  
  2770.  
  2771.  
  2772.  * a5 の指す中間言語のアドレスが何行目かを計算して '行数' に返す
  2773.     .xdef    I行数算出
  2774. I行数算出:
  2775.     moveq    #0,d1
  2776.     movea.l    4+中間言語行数,a3
  2777.     move.l    中間言語,a1
  2778. @@:
  2779.     bsr    bufget
  2780.     adda.w    d0,a1
  2781.     addq.w    #1,d1
  2782.     cmpa.l    a5,a1
  2783.     bcs    @b
  2784.     subq.l    #1,d1
  2785.     move.l    d1,行数
  2786.     rts
  2787.  
  2788.  
  2789.  
  2790.  
  2791.  
  2792.  * メモリの最後尾(mem_last)から、 d0.w だけのメモリを確保して、
  2793.  * アドレスを a0に返す
  2794.     .xdef    malloc
  2795. malloc:
  2796.     movea.l    mem_last,a0
  2797.     suba.w    d0,a0
  2798.     move.l    a0,mem_last
  2799.     rts
  2800.  
  2801.  
  2802.  * 鎖状のバッファ(size = CbufSIZE * word )を malloc して、d0.w を書き込む
  2803.  * d1.w/a0-a1 破壊
  2804.     .xdef    buf書込L
  2805. buf書込L:
  2806.     move.l    4(sp),-(sp)
  2807.     swap    d0
  2808.     bsr    buf書込
  2809.     swap    d0
  2810.     bsr    buf書込
  2811.     addq.l    #4,sp
  2812.     rts
  2813.  
  2814.     .xdef    buf書込
  2815. buf書込:
  2816.     movea.l    4(sp),a1
  2817.     addq.w    #1,8(a1)
  2818.     move.w    8(a1),d1
  2819.     andi.w    #CbufSIZE-1,d1
  2820.     bne    3f
  2821.  
  2822.     move.w    d0,d1
  2823.     move.w    #CbufSIZE*2+4,d0
  2824.     bsr    malloc
  2825.     move.w    d1,d0
  2826.     move.w    8(a1),d1
  2827.     bne    1f
  2828.     move.l    a0,4(a1)    * 先頭登録
  2829.     bra    4f
  2830. 1:
  2831.     movea.l    (a1),a1        * 今の鎖の最後尾
  2832.     move.l    a0,(a1)        * 次の鎖へのつなぎ
  2833.     movea.l    4(sp),a1    * もう一回復活
  2834.     bra    4f
  2835.  
  2836. 3:
  2837.     move.l    (a1),a0        * 今の書き込みポインタ
  2838. 4:
  2839.     move.w    d0,(a0)+
  2840.     move.l    a0,(a1)        * 書き込みポインタ登録
  2841.     rts
  2842.  
  2843.  
  2844.  
  2845.  * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
  2846.  * d1 で指されたデータを d0.w に返す
  2847.     .xdef    bufget
  2848. bufget:
  2849.     move.l    a3,-(sp)
  2850.     move.w    d1,d0
  2851. @@:
  2852.     subi.w    #CbufSIZE,d0
  2853.     bcs    @f
  2854.     movea.l    CbufSIZE*2(a3),a3
  2855.     bra    @b
  2856.  
  2857. @@:
  2858.     addi.w    #CbufSIZE,d0
  2859.     add.w    d0,d0
  2860.     move.w    (a3,d0.w),d0
  2861.  
  2862.     movea.l    (sp)+,a3
  2863.     rts
  2864.  
  2865.  
  2866.  * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
  2867.  * d1 で指された位置に d2 を書き込む (d0.w 破壊)
  2868.     .xdef    bufput
  2869. bufput:
  2870.     move.l    a3,-(sp)
  2871.     move.w    d1,d0
  2872. @@:
  2873.     subi.w    #CbufSIZE,d0
  2874.     bcs    @f
  2875.     movea.l    CbufSIZE*2(a3),a3
  2876.     bra    @b
  2877.  
  2878. @@:
  2879.     addi.w    #CbufSIZE,d0
  2880.     add.w    d0,d0
  2881.     move.w    d2,(a3,d0.w)
  2882.  
  2883.     movea.l    (sp)+,a3
  2884.     rts
  2885.  
  2886.  
  2887.     .xdef    bufgetL
  2888. bufgetL:
  2889.     bsr    bufget
  2890.     swap    d0
  2891.     addq.w    #1,d1
  2892.     bsr    bufget
  2893.     subq.w    #1,d1
  2894.     rts
  2895. bufputL:
  2896.     swap    d2
  2897.     bsr    bufput
  2898.     swap    d2
  2899.     addq.w    #1,d1
  2900.     bsr    bufput
  2901.     subq.w    #1,d1
  2902.     rts
  2903.  
  2904.  
  2905.  * 鎖バッファ が連結でなかったら、つなぐ
  2906.     .xdef    chain連結
  2907. chain連結:
  2908.     move.w    8(a1),d0
  2909.     cmpi.w    #CbufSIZE,d0
  2910.     bcs    連結必要無し
  2911.  
  2912.     move.w    d0,d1
  2913.     add.w    d0,d0
  2914.     bsr    malloc
  2915.     movea.l    4(a1),a2
  2916.     move.l    a0,4(a1)
  2917.     move.w    #CbufSIZE,d0
  2918. @@:
  2919.     move.w    (a2)+,(a0)+
  2920.     subq.w    #1,d0
  2921.     dbeq    d1,@b
  2922.     bne    連結終
  2923.     movea.l    (a2),a2
  2924.     move.w    #CbufSIZE,d0
  2925.     dbra    d1,@b
  2926. 連結終:
  2927.     move.l    a0,(a1)
  2928. 連結必要無し:
  2929.     rts
  2930.  
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936.  
  2937.  
  2938.  
  2939. .ifdef    _DEBUG
  2940. func情報:
  2941.     movem.l    d0-d7/a0-a5,-(sp)
  2942. func情報_loop:
  2943.     pea.l    func情報_name(pc)
  2944.     DOS    _PRINT
  2945.     addq.l    #4,sp
  2946.  
  2947.     lea.l    tmp,a5
  2948.     move.l    a5,-(sp)
  2949.     move.w    #$ff00,(a5)+
  2950.     DOS    _GETS
  2951.     pea.l    crlf(pc)
  2952.     DOS    _PRINT
  2953.     addq.l    #8,sp
  2954.     tst.b    (a5)
  2955.     beq    func情報_end
  2956.  
  2957.     bsr    hash
  2958.     bsr    function_check
  2959.     tst.w    d0
  2960.     beq    func情報_無し
  2961.     tst.w    d3
  2962.     bmi    func情報_内部
  2963.  
  2964.     pea.l    func情報_1(pc)
  2965.     DOS    _PRINT
  2966.     move.l    -$10+$c(a3),d0        * 実行アドレス
  2967.     lea.l    tmp,a0
  2968.     move.l    a0,(sp)
  2969.     FPACK    __HTOS
  2970.     DOS    _PRINT
  2971.     pea.l    crlf(pc)
  2972.     DOS    _PRINT
  2973.     addq.l    #8,sp
  2974.     bra    func情報_loop
  2975.  
  2976.  
  2977. func情報_内部:
  2978.     pea.l    func情報_3(pc)
  2979.     bra    @f
  2980. func情報_無し:
  2981.     pea.l    func情報_2(pc)
  2982. @@:
  2983.     DOS    _PRINT
  2984.     addq.l    #4,sp
  2985.     bra    func情報_loop
  2986.  
  2987. func情報_end:
  2988.     movem.l    (sp)+,d0-d7/a0-a5
  2989.     rts
  2990. func情報_name:
  2991.     .dc.b    '関数名:',0
  2992. func情報_1:
  2993.     .dc.b    '実行アドレス : ',0
  2994. func情報_2:
  2995.     .dc.b    '該当関数無し',13,10,0
  2996. func情報_3:
  2997.     .dc.b    '内部関数',13,10,0
  2998.     .even
  2999.  
  3000.  
  3001. DEBUG情報:
  3002.     IOCS    _ONTIME
  3003.     sub.l    _comptime(pc),d0
  3004.     lea.l    tmp,a0
  3005.     move.l    a0,-(sp)
  3006.     moveq    #6,d1
  3007.     FPACK    __IUSING
  3008.     move.l    #'/100',(a0)+
  3009.     move.w    #$0d0a,(a0)+
  3010.     clr.b    (a0)
  3011.     DOS    _PRINT
  3012.     addq.l    #4,sp
  3013.  
  3014.  
  3015.     pea.l    M01(pc)
  3016.     DOS    _PRINT
  3017.     addq.l    #4,sp
  3018.     moveq    #0,d0
  3019.     move.w    _FREEMEM(a6),d0
  3020.     move.l    d0,-(sp)
  3021.     bsr    dec_print
  3022.     pea.l    Mkb(pc)
  3023.     DOS    _PRINT
  3024.     addq.l    #8,sp
  3025.  
  3026.     pea.l    M02(pc)
  3027.     DOS    _PRINT
  3028.     addq.l    #4,sp
  3029.     lea.l    tmp,a0
  3030.     move.l    a0,-(sp)
  3031.     move.l    mem_last,d0
  3032.     sub.l    変数area,d0
  3033.     FPACK    __HTOS
  3034.     DOS    _PRINT
  3035.  
  3036.     move.w    #'(',-(sp)
  3037.     DOS    _PUTCHAR
  3038.     addq.l    #2,sp
  3039.  
  3040.     move.l    変数area,d0
  3041.     lea.l    tmp,a0
  3042.     FPACK    __HTOS
  3043.     DOS    _PRINT
  3044.  
  3045.     move.w    #'-',-(sp)
  3046.     DOS    _PUTCHAR
  3047.     addq.l    #2,sp
  3048.  
  3049.     move.l    mem_last,d0
  3050.     lea.l    tmp,a0
  3051.     FPACK    __HTOS
  3052.     DOS    _PRINT
  3053.  
  3054.     move.w    #')',-(sp)
  3055.     DOS    _PUTCHAR
  3056.     addq.l    #2,sp
  3057.  
  3058.     pea.l    crlf(pc)
  3059.     DOS    _PRINT
  3060.     addq.l    #8,sp
  3061.  
  3062.  
  3063.  
  3064.     move.w    #$20,-(sp)    * DEBUG
  3065.     pea.l    filename(pc)
  3066.     DOS    _CREATE
  3067.     movea.l    中間言語,a0
  3068.     suba.l    a0,a4
  3069.     movem.l    a0/a4,-(sp)
  3070.     move.w    d0,-(sp)
  3071.     DOS    _WRITE
  3072.     DOS    _CLOSE
  3073.     lea.l    16(sp),sp
  3074.  
  3075.     move.w    #$20,-(sp)    * DEBUG
  3076.     pea.l    filename2(pc)
  3077.     DOS    _CREATE
  3078.     move.l    変数INIT,d2
  3079.     move.l    4+変数INIT,d1
  3080. *    move.l    引数INIT,d2
  3081. *    move.l    4+引数INIT,d1
  3082.     sub.l    d1,d2
  3083.     movem.l    d1/d2,-(sp)
  3084.     move.w    d0,-(sp)
  3085.     DOS    _WRITE
  3086.     DOS    _CLOSE
  3087.     lea.l    16(sp),sp
  3088.  
  3089.  
  3090.     rts
  3091. .endif
  3092.  
  3093.     .end
  3094.  
  3095.  
  3096.